现在的位置: 首页 > 综合 > 正文

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

2013年10月21日 ⁄ 综合 ⁄ 共 3171字 ⁄ 字号 评论关闭

根据业务需求写出大概的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.业务员

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

抱歉!评论已关闭.