Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在sqlserver中使用case语句_Sql_Sql Server - Fatal编程技术网

在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,谢谢你的输入和语法。非常感谢。院长