在SQL Server

时间:2015-12-17 13:47:01

标签: 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

这是我的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。

2 个答案:

答案 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