使用COUNT(CASE WHEN ....)vs CASE WHEN = ... THEN COUNT。我得到了不同的结果,有人可以解释为什么吗?

时间:2018-02-20 17:06:23

标签: sql sql-server

当我使用方法1时:' COUNT(Case WHEN ..)'它产生我想要的输出,但当我使用第二种方法'情况下...... COUNT'方法,我得到一个对角矩阵,这不是我想要的。

我的步骤是:

i)创建了一个虚拟表

INSERT INTO job (jobid,  jobname, [priority]) 
VALUES  ('something', '1', 1), 
        ('something', '2', 2),
        ('something', '3', 3), 
        ('something', '4', 4), 
        ('something', '5', 5), 
        ('something', '6', 1), 
        ('something', '7', 1), 
        ('something', '8', 3), 
        ('something', '9', 3), 
        ('something', '10', 2);

ii)方法1:COUNT(CASE WHEN ....)

    SELECT 

COUNT(CASE  WHEN  [Priority] = 1 THEN 1 ELSE NULL END ) as Priority1,
COUNT(CASE  WHEN  [Priority] = 2 THEN 1 ELSE NULL END )as Priority2,
COUNT(CASE  WHEN  [Priority] = 3 THEN 1 ELSE NULL END )as Priority3

FROM job

结果:

  Priority1 Priority2   Priority3
  3         2           3

iii)方法2:CASE WHEN .... COUNT

SELECT 

CASE  WHEN  [Priority] = 1 THEN COUNT(*)  END  as Priority1,
CASE  WHEN  [Priority] = 2 THEN COUNT(*)  END as Priority2,
CASE  WHEN  [Priority] = 3 THEN COUNT(*)  END as Priority3

FROM job

GROUP BY [Priority]

结果:

Priority1   Priority2   Priority3
3           NULL        NULL
NULL        2           NULL
NULL        NULL        3
NULL        NULL        NULL
NULL        NULL        NULL

方法1给了我正确的结果,但方法2的输出让我感到惊讶......我期待与方法1相同的结果!

2 个答案:

答案 0 :(得分:1)

方法1: 聚合函数COUNT在表级应用,COUNT被忽略并消耗所有NULL值([优先级]不是1,2或3的情况)。所以,最后你只有一排。

方法2: 聚合函数COUNT应用于表的每一行。因此,结果包含的行数与表中唯一[Priority]值的数量相同。结果包含一些NULL,因为案例条件在这些情况下并不满意,COUNT返回NULL

答案 1 :(得分:1)

第二种方法中有一个group by,因此您将在Priority中为每个值获得一行。

所以你有点想要:

SELECT CASE  WHEN  [Priority] = 1 THEN COUNT(*)  END  as Priority1,
       CASE  WHEN  [Priority] = 2 THEN COUNT(*)  END as Priority2,
       CASE  WHEN  [Priority] = 3 THEN COUNT(*)  END as Priority3
FROM job;

但这不会奏效。因为[Priority]未汇总。

嗯,你基本上回到了你的第一个方法,其中条件在聚合函数的参数中你的期望是错误的。使用第一种方法(虽然我个人更喜欢使用SUM()COUNT())。