当我使用方法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相同的结果!
答案 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()
)。