表结构:
部门代码 部门名称 支出费用 月份
A01 AAA 50000 1
B01 BBB 10000 2
A01 AAA 20000 11
A02 AAA 9999.22 4
........
按部门统计1-12月的数据
格式显示如下:
部门代码 部门名称 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月 合计
A01 AAA 10 20 50 40 80 10 30 60 70 80 90 10 550
.......
SQL如何实现???
------解决方案--------------------
找行列转换的贴
------解决方案--------------------
- SQL code
select 部门代码 部门名称,sum(case when 月份 =1 then 支出费用 else 0 end) as '1月' ,sum(case when 月份 =2 then 支出费用 else 0 end) as '2月' ,......sum(case when 月份 =12 then 支出费用 else 0 end) as '12月' from 表
------解决方案--------------------
静态的实际很简单
- SQL code
select部门代码,部门名称,sum(case 月份 when 1 then 支出费用 else 0 end) as [1月],sum(case 月份 when 2 then 支出费用 else 0 end) as [2月]...,sum(case 月份 when 12 then 支出费用 else 0 end) as [12月],sum(支出费用) as 合计from 表group by 部门代码,部门名称
------解决方案--------------------
- SQL code
--比较简单的select [部门代码], [部门名称], sum(case when [月份] = 1 then [支出费用] else null end ) as [1月], sum(case when [月份] = 2 then [支出费用] else null end ) as [2月], ...... sum(case when [月份] = 12 then [支出费用] else null end ) as [12月] sum([支出费用]) as [合计]from [Table]group by [部门代码], [部门名称] --SQL2005以上用 pivot 详细去看msdn吧
------解决方案--------------------
- SQL code
select 部门代码,部门名称, [1]=max(case when 月份=1 then 支出费用 else 0 end), [2]=max(case when 月份=2 then 支出费用 else 0 end), [3]=max(case when 月份=3 then 支出费用 else 0 end),..... [12]=max(case when 月份=12 then 支出费用 else 0 end)from tb group by 部门代码,部门名称
------解决方案--------------------
- SQL code
--行列互转--摘自中国风博客,引用请标明内容来源--1、行换列if object_id('Class') is not null drop table ClassGoCreate table Class([Student] nvarchar(2),[Course] nvarchar(2),[Score] int)Insert Classselect N'张三',N'语文',78 union allselect N'张三',N'数学',87 union allselect N'张三',N'英语',82 union allselect N'张三',N'物理',90 union allselect N'李四',N'语文',65 union allselect N'李四',N'数学',77 union allselect N'李四',N'英语',65 union allselect N'李四',N'物理',85 Go--2000方法:--动态:declare @s nvarchar(4000)set @s=''Select @[email protected]+','+quotename([Course])+'=max(case when [Course]=' +quotename([Course],'''')+' then [Score] else 0 end)'from Class group by[Course]--select @sexec('select [Student][email protected]+' from Class group by [Student]')--生成静态:select [Student], [数学]=max(case when [Course]='数学' then [Score] else 0 end), [物理]=max(case when [Course]='物理' then [Score] else 0 end), [英语]=max(case when [Course]='英语' then [Score] else 0 end), [语文]=max(case when [Course]='语文' then [Score] else 0 end) from Class group by [Student]GO--动态:declare @s nvarchar(4000)Select @s=isnull(@s+',','')+quotename([Course]) from Class group by[Course]select @sexec('select * from Class pivot (max([Score]) for [Course] in([email protected]+'))b')--生成静态:select * from Class pivot (max([Score]) for [Course] in([数学],[物理],[英语],[语文]))b--生成格式:/*Student 数学 物理 英语 语文------- ----------- ----------- ----------- -----------李四 77 85 65 65张三 87 90 82 78(2 行受影响)*/go--加上总成绩(学科平均分)--2000方法:--动态:declare @s nvarchar(4000)set @s=''Select @[email protected]+','+quotename([Course])+'=max(case when [Course]='+quotename([Course],'''')+'then [Score] else 0 end)'from Class group by[Course]exec('select [Student][email protected]+',[总成绩]=sum([Score]) from Class group by [Student]')--加多一列(学科平均分用avg([Score]))生成动态:select [Student], [数学]=max(case when [Course]='数学' then [Score] else 0 end), [物理]=max(case when [Course]='物理' then [Score] else 0 end), [英语]=max(case when [Course]='英语' then [Score] else 0 end), [语文]=max(case when [Course]='语文' then [Score] else 0 end), [总成绩]=([Score]) --加多一列(学科平均分用avg([Score]))from Class group by [Student]go--2005方法:动态:declare @s nvarchar(4000)Select @s=isnull(@s+',','')+quotename([Course]) from Class group by[Course] --isnull(@s+',','') [email protected]exec('select [Student],[email protected]+',[总成绩] from (select *,[总成绩]=sum([Score])over(partition by [Student]) from Class) a pivot (max([Score]) for [Course] in([email protected]+'))b ')--生成静态:select [Student],[数学],[物理],[英语],[语文],[总成绩] from (select *,[总成绩]=sum([Score])over(partition by [Student]) from Class) a --平均分时用avg([Score])pivot (max([Score]) for [Course] in([数学],[物理],[英语],[语文]))b 生成格式:/*Student 数学 物理 英语 语文 总成绩------- ----------- ----------- ----------- ----------- -----------李四 77 85 65 65 292张三 87 90 82 78 337(2 行受影响)*/go--2、列转行 if not object_id('Class') is null drop table ClassGoCreate table Class([Student] nvarchar(2),[数学] int,[物理] int,[英语] int,[语文] int)Insert Classselect N'李四',77,85,65,65 union allselect N'张三',87,90,82,78Go--2000:动态:declare @s nvarchar(4000)select @s=isnull(@s+' union all ','')+'select [Student],[Course]='+quotename(Name,'''')--isnull(@s+' union all ','') [email protected] all+',[Score]='+quotename(Name)+' from Class'from syscolumns where ID=object_id('Class') and Name not in('Student')--排除不转换的列order by Colidexec('select * from ([email protected]+')t order by [Student],[Course]')--增加一个排序生成静态:select * from (select [Student],[Course]='数学',[Score]=[数学] from Class union all select [Student],[Course]='物理',[Score]=[物理] from Class union all select [Student],[Course]='英语',[Score]=[英语] from Class union all select [Student],[Course]='语文',[Score]=[语文] from Class)t order by [Student],[Course]go--2005:动态:declare @s nvarchar(4000)select @s=isnull(@s+',','')+quotename(Name)from syscolumns where ID=object_id('Class') and Name not in('Student') order by Colidexec('select Student,[Course],[Score] from Class unpivot ([Score] for [Course] in([email protected]+'))b')goselect Student,[Course],[Score] from Class unpivot ([Score] for [Course] in([数学],[物理],[英语],[语文]))b生成格式:/*Student Course Score------- ------- -----------李四 数学 77李四 物理 85李四 英语 65李四 语文 65张三 数学 87张三 物理 90张三 英语 82张三 语文 78*/--数据量太大了,还是动态吧,参考