关于部分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
*/