Select 多列计数,其中另一列不同

Select count of multiple columns WHERE another column is distinct

我需要了解有多少人点了哪种食物。我的 table 看起来像这样:

PersonId (int) Hamburger (varchar100) Fries (varchar100) Soda (varchar100)
1 "Unique burger" "Unique Fry" "Unique Soda"
2 "Unique burger" "Unique Fry" "Unique Soda"
1 "Unique burger" NULL "Unique Soda"
3 "Unique burger" "Unique Fry" NULL

如您所见,PersonID 可以多次出现。

我需要每个人的汉堡包、薯条和苏打水的总数。

理想情况下,我的结果集应该是这样的:

HamburgerCount FriesCount SodaCount
12334243 567456745 2463434

根据我的尝试,到目前为止,此查询为我提供了我想要的单个值结果:

SELECT COUNT(DISTINCT Id) AS HId
FROM Table
WHERE Hamburger IS NOT NULL

如果我想在同一个 table 中 return 多个值,这似乎有点低效。我尝试用 Hamburgers 和 Fries 对此进行子查询,但它让我得到了无穷大的相同结果。当我尝试 Union 时出错。如果我要对汉堡、薯条和苏打水进行 select 计数,我无法“在何处”指定 Id 的不同值。

我在 Whosebug 上下搜索过,我找到了关于 return 不同的多列或不同行的查询。

提前致谢。

如果您不介意垂直结果,可以使用 UNION:

    select 'hamburgers' as food, count(distinct personid) as people
    from table
    where hamburger is not null
    union
    select 'fries' as food, count(distinct personid) as people
    from table
    where fries is not null
    union 
    select 'soda' as food, count(distinct personid) as people
    from table
    where soda is not null

使用条件聚合:

SELECT COUNT(DISTINCT CASE WHEN Hamburger IS NOT NULL THEN Id END) AS HamburgerCount,
       COUNT(DISTINCT CASE WHEN Fries IS NOT NULL THEN Id END) AS FriesCount,
       COUNT(DISTINCT CASE WHEN Soda IS NOT NULL THEN Id END) AS SodaCount
FROM tablename;