SQL 行转列总结

今天做一个行转列有些感想想与大家分享:

行转列应该使用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 [年],[月],[部门]

 


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值