读书人

关于一部分Groupby

发布时间: 2013-09-05 16:02:07 作者: rapoo

关于部分Groupby
现在有一个表
员工号 区分 区分名 金额
---------------------------------
1 11 工资 10000
1 12 奖金 3000
1 13 饭补 200
1 14 车补 100
2 11 工资 8000
2 12 奖金 2000
2 13 饭补 200
2 14 车补 100
3 11 工资 10000
3 12 奖金 2000

想要得到的结果是,工资和奖金合计,饭补和车补不变,而合计的区分名为【合计】

想要的结果“
员工号 区分 区分名 金额
----------------------------------
1 NULL 合计 13000
1 13 饭补 200
1 14 车补 100
2 NULL 合计 10000
2 13 饭补 200
2 14 车补 100
3 NULL 合计 12000

谢谢了

------解决方案--------------------


if OBJECT_ID('tempdb..#temp', 'u') is not null   drop table #temp;
go
create table #temp( [员工号] varchar(100), [区分] varchar(100), [区分名] varchar(100), [金额] INT);
insert #temp
select '1','11','工资','10000' union all
select '1','12','奖金','3000' union all
select '1','13','饭补','200' union all
select '1','14','车补','100' union all
select '2','11','工资','8000' union all
select '2','12','奖金','2000' union all
select '2','13','饭补','200' union all
select '2','14','车补','100' union all
select '3','11','工资','10000' union all
select '3','12','奖金','2000'

--SQL:
SELECT 员工号, 区分名, 区分, 金额=SUM(金额)
FROM
(
select
员工号,
区分 = (CASE WHEN 区分名 NOT IN('饭补','车补') THEN NULL ELSE 区分 END),
区分名 = (CASE WHEN 区分名 NOT IN('饭补','车补') THEN '合计' ELSE 区分名 END),
金额
from #temp
) T
GROUP BY 员工号, 区分名, 区分
ORDER BY T.员工号, 区分
/*
员工号区分名区分金额
1合计NULL13000
1饭补13200
1车补14100
2合计NULL10000
2饭补13200
2车补14100
3合计NULL12000
*/

[解决办法]
select 员工号,区分,区分名,sum(金额) as 金额
from (
select 员工号,区分=CASE WHEN 区分名 IN('工资','奖金') THEN NULL ELSE 区分 END
,区分名=CASE WHEN 区分名 IN('工资','奖金') THEN '合计' ELSE 区分名 END
,金额
from #tb
)t
group by 员工号,区分,区分名

/*
1NULL合计13000
113饭补200
114车补100
2NULL合计10000
213饭补200
214车补100
3NULL合计12000

*/

读书人网 >SQL Server

热点推荐