【问题标题】:SQL: Count distinct values from one column based on multiple criteria in other columnsSQL:根据其他列中的多个条件计算一列中的不同值
【发布时间】:2013-04-15 22:07:45
【问题描述】:

我正在尝试根据多个标准计算不同的值。 下面包括示例数据练习。

表格1 ╔════════╦════════╦══════╗ ║ Bug ID ║ 状态 ║ 测试 ║ ╠════════╬════════╬══════╣ ║ 1 ║ 打开 ║ w ║ ║ 2 ║ 关闭 ║ w ║ ║ 3 ║ 打开 ║ w ║ ║ 4 ║ 打开 ║ x ║ ║ 4 ║ 打开 ║ x ║ ║ 5 ║ 关闭 ║ x ║ ║ 5 ║ 关闭 ║ x ║ ║ 5 ║ 关闭 ║ y ║ ║ 6 ║ 打开 ║ z ║ ║ 6 ║ 打开 ║ z ║ ║ 6 ║ 打开 ║ z ║ ║ 7 ║ 关闭 ║ z ║ ║ 8 ║ 关闭 ║ z ║ ╚════════╩════════╩══════╝ 期望的查询结果 ╔══════╦═══════════╦════════════╗ ║ 测试 ║ 打开错误 ║ 总错误 ║ ╠══════╬═══════════╬════════════╣ ║ w ║ 2 ║ 3 ║ ║ x ║ 1 ║ 2 ║ ║ 是 ║ 0 ║ 1 ║ ║ z ║ 1 ║ 3 ║ ╚══════╩═══════════╩════════════╝

一个给定的错误可以在多个测试中找到,对于同一个测试可以多次找到(例如:6),或两者兼而有之(例如:5)。

以下查询可以很好地准确提供“错误总数”

SELECT
Test,
COUNT(DISTINCT Bug ID) AS "Total Bugs"
FROM
Table1
GROUP BY Test

我的研究使我对以下查询产生了变化。他们错过了明显的错误,因此为“打开的错误”列返回不正确的结果(显示在查询下方)

SELECT
Test,
SUM(CASE WHEN Status <> 'Closed' THEN 1 ELSE 0 END) AS "Open Bugs"
FROM
Table1
GROUP BY Test
╔══════╦═══════════╗ ║测试║打开Bugs║ ╠══════╬═══════════╣ ║ w ║ 2 ║ ║ x ║ 2 ║ ║ 是 ║ 0 ║ ║ z ║ 3 ║ ╚══════╩═══════════╝

当然,我的最终结果必须在一个表中提供两个计数列(而不是像我出于演示目的那样使用单独的查询)。

我不想依赖多个子查询,因为我的实时示例将有两个以上的列,其计数来自同一个表,但条件不同。

我正在使用 SQL Server(不确定版本)。

非常感谢任何帮助。

【问题讨论】:

    标签: sql sql-server count distinct multiple-columns


    【解决方案1】:

    您可以使用以下代码获得条件count(distinct)

    SELECT Test, COUNT(DISTINCT "Bug ID") AS "Total Bugs",
    count(distinct (CASE WHEN "Status" <> 'Closed' THEN "Bug ID" END)) as "Open Bugs"
    FROM Table1
    GROUP BY Test
    

    case 语句检查条件。当为真时,它返回Bug ID。如果不存在,则默认为 NULL,因此不计算 id。

    【讨论】:

    • 非常有帮助。我不知道您可以在“THEN”之后引用列。谢谢!
    • 谢谢 - 用这样的东西替换了一堆低效、难以理解的连接。
    猜你喜欢
    • 2019-03-09
    • 1970-01-01
    • 2019-05-20
    • 1970-01-01
    • 2018-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多