Sql交叉表简单实现
来源:互联网 发布:youtube代理软件fg 编辑:程序博客网 时间:2024/06/07 17:33
最近碰到一需求,是酱紫的: 一个销售商品表, 每年每月每天都卖出N种不同种类的商品, 最后要统计每月每种商品的销售额. 或每年的, 在此我模拟创建了一个简单的表, 主要说明经验和大家一块分享, 若发现有问题, 欢迎随时指教.
如下:(此表过于简单, 主要用于说明交叉表)
按某一年的多月查询结果如下:
多年对比查询结果如下:
具体实现代码如下:
----------按多年查询------------ ----------按一年多月查询------------ ----------查询下源表中的数据对比下------------ ---------如果不用了可以删除函数和表--------------
----------创建一个交叉表--------------
create table salesRecord (
id int primary key identity(1,1) not null,
[date] datetime not null,
[goods] varchar(10) not null,
[money] decimal(10,2) default 0
)
----------向交叉表中插入记录--------------
insert into salesRecord values('2009-3-2','显示器',2300)
insert into salesRecord values('2009-1-3','键盘',30)
insert into salesRecord values('2009-3-2','机箱',200)
insert into salesRecord values('2009-7-2','鼠标',55)
insert into salesRecord values('2009-12-2','硬盘',455)
insert into salesRecord values('2009-9-2','屏保膜',10)
insert into salesRecord values('2009-4-28','硬盘',455)
insert into salesRecord values('2009-2-9','电源线',15)
insert into salesRecord values('2009-3-5','主板',605)
insert into salesRecord values('2009-8-15','摄像头',120)
insert into salesRecord values('2009-5-18','U盘',105)
insert into salesRecord values('2008-5-28','U盘',105)
insert into salesRecord values('2009-10-11','U盘',80)
-------创建访问交叉表的查询语句生成函数---(商品种类赿多,查出出的表字段就赿多)--------------
/*
* @year 某一年
* @ym 有可能是年 有可能是月, 看后边的@flag决定
* @month 某一月
* @flag 对前边参数的说明标记.
* 如果 YY 则某年到某年查询,前两个参数为开始年,结束年,第三个参数无效(但仍然需要传入任意整型值)
* 如果YMM 某一年从几月到几月查询 ,第一个参数为某年, 后两个参数为开始月和结束月.
* @returns 返回组装后的字符串.
*/
create function getQueryStr (@y int,@ym int,@m int,@flag varchar(3))
returns varchar(7000)
as
begin
declare @tempStr varchar(20)
declare @rtnStr varchar(7000)
declare @condStr varchar(500)
--判断如果是YY则是查某一年到某一年,组装查询串及条件
if(@flag='YY')
begin
set @rtnStr=' select year(date) as ''年份'', '
set @condStr=' year(date)>= '+cast(@y as varchar) +' and year(date)<= '+cast(@ym as varchar)+' group by year(date)'
end
else if(@flag='YYM')
--否则查某一年的某一月到某一月,组装查询串及条件
begin
set @rtnStr=' select cast(month(date) as varchar)+''月'' as ''月份'', '
set @condStr=' year(date)= '+cast(@y as varchar)+' and month(date)>= '+cast(@ym as varchar)+' and month(date)<= '+cast(@m as varchar)+' group by month(date)'
end
declare getOne cursor
for
select distinct goods from salesRecord
open getOne
fetch next from getOne into @tempStr
while @@fetch_status=0
begin
set @rtnStr = @rtnStr+' sum(case goods when '''+@tempStr+''' then money else 0 end) as '''+@tempStr+''','
fetch next from getOne into @tempStr
end
close getOne
deallocate getOne
set @rtnStr=left(@rtnStr,len(@rtnStr)-1)
set @rtnStr=@rtnStr+' from salesRecord where '+@condStr
return @rtnStr
end
declare @str varchar(7000)
set @str=dbo.getQueryStr(2008,2009,0,'YY');
exec(@str)
declare @str varchar(7000)
set @str=dbo.getQueryStr(2009,0,12,'YYM');
exec(@str)
select * from salesRecord order by date
drop function getQueryStr
drop table salesRecord
- Sql交叉表简单实现
- 应用SQL交叉表实现行列转换
- SQL实现交叉表的方法
- SQL实现交叉表的方法
- SQl 实现动态交叉表查询
- SQL交叉表查询 如何实现
- sql中交叉表的实现
- sql 字符串拼接 实现交叉表
- 交叉表的sql实现(转)
- 交叉表的简单实现2:使用前端程序实现
- SQL实现动态交叉表【用游标实现】
- SQL交叉报表的实现
- sql语句交叉报表实现
- SQL交叉表实例
- SQL交叉表实例
- SQL交叉表实例
- SQL交叉表实例
- SQL交叉表实例
- 修复另存为时无法显示文件夹快捷方式的问题
- [C++再学习系列] 模板函数的自定义点
- JAVA 程序在内存上的分布
- 实现和IE浏览器交互的几种方法的介绍
- jQuery对象与DOM对象之间的转换
- Sql交叉表简单实现
- vsftpd配置详解
- 联想 sl 400 无线网卡驱动
- 使用LESS或Sass重构CSS代码
- Teradata 中表的分类及其各类型表应该注意的问题总结
- 瑞星防火墙与QQ医生发生冲突 卡卡安全助手爱莫能助
- 教你六招 关闭移动存储自动播放
- 1339 表达式求值(+ - * / )
- 远程桌面连接设置