小编典典

SQL:根据其他列中的多个条件来计算一列中的不同值

sql

我正在尝试根据多个条件来计算不同的值。 下面包括样本数据练习。

Table1 ╔════════╦════════╦══════╗ ║ Bug ID ║ Status ║ Test ║ ╠════════╬════════╬══════╣ ║ 1 ║ Open ║ w ║ ║ 2 ║ Closed ║ w ║ ║ 3 ║ Open ║ w ║ ║ 4 ║ Open ║ x ║ ║ 4 ║ Open ║ x ║ ║ 5 ║ Closed ║ x ║ ║ 5 ║ Closed ║ x ║ ║ 5 ║ Closed ║ y ║ ║ 6 ║ Open ║ z ║ ║ 6 ║ Open ║ z ║ ║ 6 ║ Open ║ z ║ ║ 7 ║ Closed ║ z ║ ║ 8 ║ Closed ║ z ║ ╚════════╩════════╩══════╝ Desired Query Results ╔══════╦═══════════╦════════════╗ ║ Test ║ Open Bugs ║ Total Bugs ║ ╠══════╬═══════════╬════════════╣ ║ w ║ 2 ║ 3 ║ ║ x ║ 1 ║ 2 ║ ║ y ║ 0 ║ 1 ║ ║ z ║ 1 ║ 3 ║ ╚══════╩═══════════╩════════════╝

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

以下查询可以很好地准确交付“ Total Bugs”

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
╔══════╦═══════════╗
║ Test ║ Open Bugs ║
╠══════╬═══════════╣
║ w    ║         2 ║
║ x    ║         2 ║
║ y    ║         0 ║
║ z    ║         3 ║
╚══════╩═══════════╝

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

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

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

任何帮助是极大的赞赏。


阅读 222

收藏
2021-05-05

共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语句检查条件。设为true时,会传回Bug ID。如果不存在,则默认为NULL,因此不会对ID进行计数。

2021-05-05