【问题标题】:How to combine multiple count statements in SQL如何在 SQL 中组合多个计数语句
【发布时间】:2014-07-27 14:23:36
【问题描述】:

我有一个包含 ID 列表的表格,每个 ID 的状态为 HW、HB、PIP 或 TBC。

我想计算每种状态的人数,所以我会有一个看起来像这样的表格

HW HB PIP 待定

45 27 9 49

我现在有

    (SELECT COUNT(*) AS 'StatusHW' From HomeworkerStatus WHERE Status='Homeworker')
    UNION       
    (SELECT COUNT(*) AS 'StatusHB' From HomeworkerStatus WHERE Status='Home Based')
    UNION
    (SELECT COUNT(*) AS 'StatusPIP' From HomeworkerStatus WHERE Status='PIP') 
    UNION
    (SELECT COUNT(*) AS 'StatusTBC' From HomeworkerStatus WHERE Status='TBC')           

这会返回

状态HW

1 45

2 27

3 9

4 49

我也试过

    SELECT Status,
    sum(case when Status = 'Homeworker' then 1 else 0 end) StatusHW,
    sum(case when Status = 'Home Based' then 1 else 0 end) StatusHB,
    sum(case when Status = 'PIP' then 1 else 0 end) StatusPIP,
    sum(case when Status = 'TBC' then 1 else 0 end) StatusTBC
    FROM HomeworkerStatus
    GROUP BY Status

这将返回一个 4x4 表,其中包含第 1、2、3、4 行和列 Status、StatusHW、...、StatusTBC。这更接近我所追求的,但仍然不对。

任何帮助将不胜感激。

谢谢

【问题讨论】:

    标签: sql sql-server select count sum


    【解决方案1】:

    只需删除group by,因为在聚合时已经处理了这些条件:

     SELECT 
        -- Status,
        sum(case when Status = 'Homeworker' then 1 else 0 end) StatusHW,
        sum(case when Status = 'Home Based' then 1 else 0 end) StatusHB,
        sum(case when Status = 'PIP' then 1 else 0 end) StatusPIP,
        sum(case when Status = 'TBC' then 1 else 0 end) StatusTBC
        FROM HomeworkerStatus
        -- GROUP BY Status
    

    【讨论】:

    • 像梦一样工作,谢谢!
    • 这与@ThorstenKettner 的回答有何不同?
    • 好吧,在回答时他错过了删除状态列,在这种情况下,聚合将不起作用,因为没有 group by 我们不能在 select 子句中有非聚合列。希望它能澄清这一点。
    【解决方案2】:

    不要GROUP BY Status,如果你只想要一行:

    SELECT
    sum(case when Status = 'Homeworker' then 1 else 0 end) StatusHW,
    sum(case when Status = 'Home Based' then 1 else 0 end) StatusHB,
    sum(case when Status = 'PIP' then 1 else 0 end) StatusPIP,
    sum(case when Status = 'TBC' then 1 else 0 end) StatusTBC
    FROM HomeworkerStatus;
    

    【讨论】:

    • 我最初是这样做的,但得到错误 'Msg 8120, Level 16, State 1, Line 1 Column 'HomeworkerStatus.Status' 在选择列表中无效,因为它不包含在任何一个聚合函数或 GROUP BY 子句。'
    • 您需要删除SELECT Status。否则查询将不会运行
    • @Arion:是的,我忽略了这一点。谢谢;我将编辑我的答案。
    • 啊,是的,刚刚意识到这一点。谢谢!
    • @ThorstenKettner:现在你得到了 +1
    猜你喜欢
    • 2018-02-16
    • 2016-11-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-07
    • 2021-10-27
    • 2017-07-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多