我有一个临时表:
Job Role Item
A (null) 1
O (null) 1
P (null) 2
PP (null) 4
S (null) 6
A C 2
P C 7
PP C 5
S C 4
P V 9
PP V 1
这是我的SQL脚本使用case语句:
select case when job ='PP' then 'P2'
when role in ('C', 'V') then 'SM'
else null
end as title,
sum (item) as price
From temp
group by above case statement
结果如下
Title price
(null) 10
P2 10
SM 22
有人会调整我的案例陈述,为什么标题SM
总和只有22而不是28。
答案 0 :(得分:3)
首先评估job ='PP'
条件,因此任何同时包含job ='PP'
和role in ('C', 'V')
的行都将返回'P2'
,而不是'SM'
。有两个这样的行,总价格为5 + 1 = 6,这解释了您期望的28
与您实际获得的22
之间的差异。< / p>
答案 1 :(得分:1)
这是一个查询,它将使用条件聚合和unpivoting为您提供所需的输出。你也可以单独完成并将它们联合起来:
DECLARE @t TABLE
(
Job VARCHAR(10) ,
Role CHAR(1) ,
Item INT
)
INSERT INTO @t
VALUES ( 'A', NULL, 1 ),
( 'O', NULL, 1 ),
( 'P', NULL, 2 ),
( 'PP', NULL, 4 ),
( 'S', NULL, 6 ),
( 'A', 'C', 2 ),
( 'P', 'C', 7 ),
( 'PP', 'C', 5 ),
( 'S', 'C', 4 ),
( 'P', 'V', 9 ),
( 'PP', 'V', 1 )
;WITH cte AS(SELECT SUM(CASE WHEN job ='PP' THEN item ELSE 0 END) P2,
SUM(CASE WHEN role IN ( 'C', 'V' ) THEN item ELSE 0 END) SM,
SUM(CASE WHEN role IS NULL THEN item ELSE 0 END) NN
FROM @t)
SELECT title, price
FROM cte
UNPIVOT(price FOR title IN([P2],[SM],[NN]))u