SQL如何按去重PersonId统计多列非空值的总计数
实现方案
你可以通过条件聚合的方式一次查询完成三个字段的去重计数,不需要多次查表,也不需要子查询或union拼接,语句如下:
SELECT COUNT(DISTINCT CASE WHEN Hamburger IS NOT NULL THEN PersonId END) AS HamburgerCount, COUNT(DISTINCT CASE WHEN Fries IS NOT NULL THEN PersonId END) AS FriesCount, COUNT(DISTINCT CASE WHEN Soda IS NOT NULL THEN PersonId END) AS SodaCount FROM 替换为你的实际表名;
逻辑说明
- 每个
CASE WHEN会先判断对应食品字段是否非空,满足条件就返回当前行的PersonId,不满足则返回NULL COUNT(DISTINCT)在计数时会自动忽略NULL值,同时对非空的PersonId去重,刚好符合统计「订购过对应食品的唯一用户数」的需求- 你给出的示例数据执行后返回的结果为:
| HamburgerCount | FriesCount | SodaCount |
|---|---|---|
| 3 | 3 | 2 |
内容的提问来源于stack exchange,提问作者morganherg
相关产品推荐
相关产品推荐

