在sqlserver中使用case语句
我在下面有一张临时表:在sqlserver中使用case语句,sql,sql-server,Sql,Sql Server,我在下面有一张临时表: 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 下面是我使用ca
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
下面是我使用case语句的SQL脚本:
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。首先计算job='PP'
条件,所以在('C','V')中同时具有job='PP'
和角色的任何行都将返回'P2'
,而不是'SM'
。共有两行,总价格为5+1=6,这解释了预期的28
与实际得到的22
之间的差异。首先计算job='PP'
条件,因此在('C','V')中同时具有job='PP'
和角色的任何行
将返回'P2'
,而不是'SM'
。共有两行,总价格为5+1=6,这解释了您期望的28
与实际得到的22
之间的差异。以下是一个查询,它将使用条件聚合和取消激励为您提供所需的输出。您还可以进行单独的求和,并将其合并:
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
下面是一个查询,它将使用条件聚合和取消激活为您提供所需的输出。您还可以进行单独的求和,并将其合并:
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
因为对于6个项目,Job等于“PP”,并且因为它在您的案例中列在第一位,所以优先。您的案例
语句中存在条件冲突。它不会同时接受这两个条件,它只会选择遇到的第一个案例。只需注意,这是一个case
表达式,而不是case语句。(此处用于SELECT
语句)因为对于6项,Job等于'PP',并且在您的案例中它列在第一位,所以优先。您的案例语句中存在条件冲突。它不会同时接受这两个条件,它只会选择遇到的第一个案例。只需注意,这是一个case
表达式,而不是case语句。(这里用在SELECT
语句中。)刚刚跳到帖子!好地方;)很好地捕捉到了微妙的一点感谢所有的反馈!正确计算价格的正确代码是什么?我可以创建另一个临时表来分隔PP、SM和null。然后使用上面的case表达式,使用新的temp表与原始表连接。我想@Giorgi,谢谢你的输入和语法。非常感谢。迪恩,刚刚到达终点!好地方;)很好地捕捉到了微妙的一点感谢所有的反馈!正确计算价格的正确代码是什么?我可以创建另一个临时表来分隔PP、SM和null。然后使用上面的case表达式,使用新的temp表与原始表连接。我想@Giorgi,谢谢你的输入和语法。非常感谢。院长