SQL查询计算满足不同条件的结果数量

5

我有一个看起来像这样的查询

SELECT ju.name,
    COUNT(DISTINCT p.value) AS nproblems
FROM #problems p
JOIN <thing> ju ON <whatever>
WHERE <condition 1>
    AND <condition 2>
    AND <condition 3>
GROUP BY ju.name
ORDER BY nproblems DESC

这很好,给我一个带有名称和值的结果集。但我真正关心的是没有 WHERE 子句的问题数量,然后只有条件 1,然后是条件 1+2,最后是条件 1+2+3。我想写成:

SELECT ju.name,
    COUNT(DISTINCT p.value WHERE <condition 1>) foo,
    COUNT(DISTINCT p.value WHERE <condition 2>) bar,
...

但遗憾的是我不能。有没有一个好的方法来做到这一点?


+1 不错的问题:正如Mahmoud建议的那样 - 尝试在SELECT子句中使用CASE并摆脱WHERE - whytheq
1个回答

4
您可以使用CASE表达式来实现此目的:
SELECT ju.name,
    SUM(CASE WHEN <condition 1> THEN 1 ELSE 0 END) AS foo,
    SUM(CASE WHEN <condition 1> THEN 1 ELSE 0 END) AS bar,
    ...
FROM #problems p
JOIN <thing> ju ON <whatever>
GROUP BY ju.name
ORDER BY nproblems DESC;

然而: 如果你使用支持PIVOT表操作符的RDBMS,如MS SQL Server或Oracle,你可以直接使用它来完成。


由于您正在使用SQL Server,因此可以使用PIVOT表操作符来实现:

SELECT *
FROM 
(
) AS t
PIVOT
(
   COUNT(value)
   FOR name IN(...)
) AS p;

1
太棒了,谢谢。我确实在使用 MS SQL Server -- 不确定我该如何使用数据透视表。你能给个例子吗? - Katriel
@katrielalex - 这取决于情况,我只是发布了一个简单的伪代码来说明如何实现,但还有其他变体。您能否请提供两个表格中的一些示例数据以及所需的输出?这将会很有帮助。 - Mahmoud Gamal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接