7

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

           表格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(不确定发布)。

任何帮助是极大的赞赏。

4

1 回答 1

21

您可以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。

于 2013-04-22T21:08:45.723 回答