[MSSQL]一步一步教你利用case when 实现行列转换

根据业务需求写出大概的sql:

select datepart(month,[Date]) 月份,users.[name] 业务员,count(users.[name]) 数量,t.[Description] 类别 from Quo_Standardcost inner join users on BusinessId=users.id inner join (select UserId,[Description] from JobType inner join JobTypeDetail on ParentId=JobType.Id) AS t ON BusinessId=t.UserId group by datepart(month,[Date]),t.[Description],name order by t.[Description]


最终的结果是

中间写入临时表,比较好操作 主要是没办法 SQL SERVER 2000版本低呀 否则就用with了

第二步:

按月份,业务员,类别汇总吧

select 业务员,类别, 一月=isnull(sum(case 月份 when '1' then 数量 end),0), 二月=isnull(sum(case 月份 when '2' then 数量 end),0), 三月=isnull(sum(case 月份 when '3' then 数量 end),0), 四月=isnull(sum(case 月份 when '4' then 数量 end),0), 五月=isnull(sum(case 月份 when '5' then 数量 end),0), 六月=isnull(sum(case 月份 when '6' then 数量 end),0), 七月=isnull(sum(case 月份 when '7' then 数量 end),0), 八月=isnull(sum(case 月份 when '8' then 数量 end),0), 九月=isnull(sum(case 月份 when '9' then 数量 end),0), 十月=isnull(sum(case 月份 when '10' then 数量 end),0), 十一月=isnull(sum(case 月份 when '11' then 数量 end),0), 十二月=isnull(sum(case 月份 when '12' then 数量 end),0) from #tempt group by 月份,业务员,类别

第三步:合并同类项目

select 业务员,类别, sum(一月) as 一月, sum(二月) as 二月, sum(三月) as 三月, sum(四月) as 四月, sum(五月) as 五月, sum(六月) as 六月, sum(七月) as 七月, sum(八月) as 八月, sum(九月) as 九月, sum(十月) as 十月, sum(十一月) as 十一月, sum(十二月) as 十二月 from ( select 业务员,类别, 一月=isnull(sum(case 月份 when '1' then 数量 end),0), 二月=isnull(sum(case 月份 when '2' then 数量 end),0), 三月=isnull(sum(case 月份 when '3' then 数量 end),0), 四月=isnull(sum(case 月份 when '4' then 数量 end),0), 五月=isnull(sum(case 月份 when '5' then 数量 end),0), 六月=isnull(sum(case 月份 when '6' then 数量 end),0), 七月=isnull(sum(case 月份 when '7' then 数量 end),0), 八月=isnull(sum(case 月份 when '8' then 数量 end),0), 九月=isnull(sum(case 月份 when '9' then 数量 end),0), 十月=isnull(sum(case 月份 when '10' then 数量 end),0), 十一月=isnull(sum(case 月份 when '11' then 数量 end),0), 十二月=isnull(sum(case 月份 when '12' then 数量 end),0) from #tempt group by 月份,业务员,类别) t1 group by 业务员,类别



同理单独汇总 按类别合计:类别和业务员排序

select * from ( select 业务员,类别, sum(一月) as 一月, sum(二月) as 二月, sum(三月) as 三月, sum(四月) as 四月, sum(五月) as 五月, sum(六月) as 六月, sum(七月) as 七月, sum(八月) as 八月, sum(九月) as 九月, sum(十月) as 十月, sum(十一月) as 十一月, sum(十二月) as 十二月 from ( select 业务员,类别, 一月=isnull(sum(case 月份 when '1' then 数量 end),0), 二月=isnull(sum(case 月份 when '2' then 数量 end),0), 三月=isnull(sum(case 月份 when '3' then 数量 end),0), 四月=isnull(sum(case 月份 when '4' then 数量 end),0), 五月=isnull(sum(case 月份 when '5' then 数量 end),0), 六月=isnull(sum(case 月份 when '6' then 数量 end),0), 七月=isnull(sum(case 月份 when '7' then 数量 end),0), 八月=isnull(sum(case 月份 when '8' then 数量 end),0), 九月=isnull(sum(case 月份 when '9' then 数量 end),0), 十月=isnull(sum(case 月份 when '10' then 数量 end),0), 十一月=isnull(sum(case 月份 when '11' then 数量 end),0), 十二月=isnull(sum(case 月份 when '12' then 数量 end),0) from #tempt group by 月份,业务员,类别) t1 group by 业务员,类别 union all select '总计' as 业务员,类别, sum(一月) as 一月, sum(二月) as 二月, sum(三月) as 三月, sum(四月) as 四月, sum(五月) as 五月, sum(六月) as 六月, sum(七月) as 七月, sum(八月) as 八月, sum(九月) as 九月, sum(十月) as 十月, sum(十一月) as 十一月, sum(十二月) as 十二月 from ( select 类别, 一月=isnull(sum(case 月份 when '1' then 数量 end),0), 二月=isnull(sum(case 月份 when '2' then 数量 end),0), 三月=isnull(sum(case 月份 when '3' then 数量 end),0), 四月=isnull(sum(case 月份 when '4' then 数量 end),0), 五月=isnull(sum(case 月份 when '5' then 数量 end),0), 六月=isnull(sum(case 月份 when '6' then 数量 end),0), 七月=isnull(sum(case 月份 when '7' then 数量 end),0), 八月=isnull(sum(case 月份 when '8' then 数量 end),0), 九月=isnull(sum(case 月份 when '9' then 数量 end),0), 十月=isnull(sum(case 月份 when '10' then 数量 end),0), 十一月=isnull(sum(case 月份 when '11' then 数量 end),0), 十二月=isnull(sum(case 月份 when '12' then 数量 end),0) from #tempt group by 类别) t2 group by 类别 ) t3 order by t3.类别,t3.业务员


完成啦,写成存储过程 供调用!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值