【问题标题】:Select count of multiple columns WHERE another column is distinct选择多列的计数 WHERE 另一列是不同的
【发布时间】:2021-12-09 09:28:59
【问题描述】:

我需要了解有多少人点了什么类型的食物。我的桌子看起来像这样:

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

如果我想在同一个表中返回多个值,这似乎有点低效。我尝试用汉堡包和薯条对此进行子查询,但它让我得到了无限的相同结果。当我尝试联合时它出错了。如果我要对汉堡、薯条和苏打水进行选择计数,我无法为 Id “在哪里”一个不同的值。

我在 StackOverflow 上下搜索,我发现查询返回不同的多列或不同的行。

提前致谢。

【问题讨论】:

  • 只标记您使用的数据库。
  • 这些列的数据类型是什么?

标签: sql count conditional-aggregation


【解决方案1】:

如果您不介意垂直结果,可以使用 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

【讨论】:

  • 非常感谢!
【解决方案2】:

使用条件聚合:

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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-31
    • 2015-01-11
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    • 2018-03-11
    • 1970-01-01
    相关资源
    最近更新 更多