【问题标题】:How to COUNT different values without adding to GROUP BY如何在不添加到 GROUP BY 的情况下计算不同的值
【发布时间】:2019-08-23 03:39:03
【问题描述】:

我有一个数据集,其中包含每个“作业”记录的名称,以及作业是通过还是失败。我想在一行中显示名称、作业数量、通过的数量和失败的数量。

我正在对名称进行分组,并在名称上使用 COUNT 来计算作业总数,这工作正常,但如果不将它们添加到导致数据的 GROUP BY 子句中,我无法显示通过的数量和失败的数量再次分开。

SELECT  I.Name, Count(I.Name) As NumberOfJobs,
CASE WHEN WI.resultTypeID = 1 THEN COUNT(WI.resultTypeID) END AS [Passed],
CASE WHEN WI.resultTypeID = 2 THEN COUNT(WI.resultTypeID) END AS [Failed],
FROM DB.DBO.People AS I 
INNER JOIN DB2.dbo.Jobs AS WI  ON I.JOBID = WI.JOBID
GROUP BY I.Name, wi.resultTypeID
    +-----------+-----------+--------+--------+
    |   Name    | NumofJobs | Passed | Failed |
    +-----------+-----------+--------+--------+
    | Dale Test |         2 | 2      | NULL   |
    | Dale Test |         2 | NULL   | 2      |
    +-----------+-----------+--------+--------+

当我将 ResultTypeID 添加到 GROUP BY 时会发生这种情况,但我想要这个:

    +-----------+-----------+--------+--------+
    |   Name    | NumofJobs | Passed | Failed |
    +-----------+-----------+--------+--------+
    | Dale Test |         4 |      2 |      2 |
    +-----------+-----------+--------+--------+

有没有办法做到这一点?

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    您需要条件聚合。 case 表达式是聚合函数的参数:

    SELECT I.Name, Count(*) As NumberOfJobs,
           SUM(CASE WHEN WI.resultTypeID = 1 THEN 1 ELSE 0 END) AS [Passed],
           SUM(CASE WHEN WI.resultTypeID = 2 THEN 1 ELSE 0 END) AS [Failed],
    FROM DB.DBO.People I INNER JOIN
         DB2.dbo.Jobs WI
         ON I.JOBID = WI.JOBID
    GROUP BY I.Name;
    

    我猜wi.resultTypeID 不是NULL,所以我将COUNT() 替换为SUM(),因为在这种情况下我更喜欢SUM()

    【讨论】:

    • 完美!这可以根据需要工作,奇怪的是我想我明白怎么做!非常感谢!
    【解决方案2】:

    您无需将查询按wi.resultTypeID 分组。

    只需从 group by 语句中删除 wi.resultTypeID 并将其放入聚合函数中:

    SELECT  I.Name, Count(I.Name) As NumberOfJobs,
    SUM(CASE WHEN WI.resultTypeID = 1 THEN 1 ELSE 0 END) AS [Passed],
    SUM(CASE WHEN WI.resultTypeID = 2 THEN 1 ELSE 0 END) AS [Failed],
    FROM DB.DBO.People AS I 
    INNER JOIN DB2.dbo.Jobs AS WI  ON I.JOBID = WI.JOBID
    GROUP BY I.Name
    

    【讨论】:

    • 谢谢! Gordon Linoff 先生提供了相同的答案,但我感谢所有的帮助,这个社区太棒了!
    猜你喜欢
    • 1970-01-01
    • 2018-10-12
    • 2012-01-26
    • 2020-07-13
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 2013-05-17
    相关资源
    最近更新 更多