逐月对比的交叉表处理
来源:互联网 发布:linux下gcc安装 编辑:程序博客网 时间:2024/04/29 04:29
/*--原帖地址:
http://community.csdn.net/Expert/topic/3841/3841808.xml?temp=.4308588
--*/
--测试数据
create table tb(year int,month int,No varchar(10),Name varchar(10),部门 varchar(10),工资 int)
insert tb select 2004,10,'A001','AAA','DDD',1000
union all select 2004,10,'B001','BBB','DDD',800
union all select 2004,11,'A001','AAA','DDD',1100
union all select 2004,11,'B001','BBB','DDD',1000
union all select 2004,12,'A001','AAA','DDD',1200
union all select 2004,12,'B001','BBB','DDD',1050
/*--处理要求
将月份做为字段,并且反应逐月的工资增幅,例如上面的数据要求结果如下,注意最小的年月是没有增幅的
No Name 部门 2004_10 2004_11 2004_11增幅 2004_12 2004_12增幅
------ ------ ------ --------- -------- ----------- --------- ------------
A001 AAA DDD 1000 1100 10.00% 1200 9.09%
B001 BBB DDD 800 1000 25.00% 1050 5.00%
--*/
go
--查询处理
declare @s nvarchar(4000),@i int
select @s='',@i=0
select @s=@s+','+quotename(fd)
+'=sum(case when a.year='+year
+' and a.month='+month
+' then a.工资 end)'
+case @i when 0 then ''
else ','+quotename(fd+'增幅')
+'=cast(cast(sum(case when a.year='+year
+' and a.month='+month
+' then a.工资-b.工资 end)*100.'
+'/sum(case when a.year='+year
+' and a.month='+month
+' then b.工资 end)'
+' as decimal(10,2)) as varchar)+''%'''
end,@i=@i+1
from(
select year=rtrim(year),month=rtrim(month),
fd=rtrim(year)+'_'+rtrim(month)
from tb group by year,month)a
exec('select a.No,a.Name,a.部门'+@s+'
from tb a
left join tb b on a.No=b.No and a.Name=b.Name and a.部门=b.部门
and a.year=b.year+(b.month)/12
and a.month=b.month%12+1
group by a.No,a.Name,a.部门')
go
--删除测试
drop table tb
- 逐月对比的交叉表处理
- 逐月对比的交叉表处理
- 逐月对比的交叉表处理
- 逐月对比的交叉表处理
- 逐月对比的交叉表处理
- 逐月对比的交叉表处理
- 逐月对比的交叉表处理
- 逐月对比的交叉表处理
- 逐月对比的交叉表处理
- 逐月对比的交叉表处理
- 逐月对比的交叉表处理
- 逐月对比的交叉表处理
- 逐月对比的交叉表处理
- 逐月对比的交叉表处理
- 逐月对比的交叉表处理
- 逐月对比的交叉表处理
- 逐月对比的交叉表处理
- [SQL]交叉表的处理
- 根据当月数据库自动生成下个月数据库--2
- 根据当月数据库自动生成下个月数据库--1
- 逐记录导出text/ntext字段值为文本文件
- 随机排序分页处理示例
- 无规律自定义分段的分类汇总+交叉表处理
- 逐月对比的交叉表处理
- 特殊分页处理
- 树形数据转换
- 自定义公式的计算处理
- 动态关联表
- 模拟多级表头的分组统计
- 动态分组查询
- 索引对查询条件顺序的影响
- 展开BOM