今天做一个行转列有些感想想与大家分享:
行转列应该使用case 【想要把某个行转成列的列名】 when 【里将各个列的值放进去】 then 【分组后某个值要进行汇总行】else 0 end
动态生成的话,将想要用的转的,用selec查出来拼成以上格式就可以了;
declare @sql varchar(8000)----如果大于8000只能用程序去拼一个sql串,而不能用sql了
select @sql=@sql+max(max( case [科目] when '通讯邮电费' then [金额] else 0 end)[科目])
1.如果 年,月,部门没有重复的话使用max
select [年],[月],[部门]
,max( case [科目] when '通讯邮电费' then [金额] else 0 end)[通讯邮电费]
,max( case [科目] when '餐费' then [金额] else 0 end)[餐费]
,max( case [科目] when '停车过路费' then [金额] else 0 end)[停车过路费]
,max( case [科目] when '工资' then [金额] else 0 end)[工资]
from table1
group by [年],[月],[部门]
2如果年,月,部门有重复的话使用max会丢失数据,应该使用sum
select [年],[月],[部门]
,sum( case [科目] when '通讯邮电费' then [金额] else 0 end)[通讯邮电费]
,sum( case [科目] when '餐费' then [金额] else 0 end)[餐费]
,sum( case [科目] when '停车过路费' then [金额] else 0 end)[停车过路费]
,sum( case [科目] when '工资' then [金额] else 0 end)[工资]
from table1
group by [年],[月],[部门]