用于计算记录数的 SQL 查询必须与记录总数匹配

Posted

技术标签:

【中文标题】用于计算记录数的 SQL 查询必须与记录总数匹配【英文标题】:SQL Query to count number of records must match total number of records 【发布时间】:2018-07-30 11:16:07 【问题描述】:

我有两张桌子

结果大师

+------+-------------+
| QnID | Description |
+------+-------------+
|    1 | Qn1         |
|    2 | Qn2         |
|    3 | Qn3         |
|    4 | Qn4         |
|    5 | Qn5         |
+------+-------------+

结果详情

+----+------+--------+--------+
| ID | QnID | TCDesc | Result |
+----+------+--------+--------+
|  1 |    1 | TC1    | PASS   |
|  2 |    1 | TC2    | FAIL   |
|  3 |    1 | TC3    | PASS   |
|  4 |    2 | TC1    | PASS   |
|  5 |    3 | TC1    | PASS   |
|  6 |    3 | TC1    | PASS   |
|  7 |    3 | TC3    | PASS   |
+----+------+--------+--------+

我需要一个返回以下结果的查询:

+----+------+--------+
| ID | QnID | Result |
+----+------+--------+
|  1 |    2 | PASS   |
|  2 |    3 | PASS   |
|  3 |    4 | ERROR  |
|  4 |    5 | ERROR  |
+----+------+--------+

条件: 每个问题都有不同数量的测试用例“ResultDetails”,我需要选择所有测试用例都通过的问题(特定问题的条目数必须与相同的测试用例数相同)或错误(ResultDetail没有问题条目)。

谁能帮我解答一下,谢谢。

【问题讨论】:

我不明白你的问题。 @TimBiegeleisen 我已经详细阐述了我的问题,您能帮我解决一下吗 您的列是否真的命名为 1、2、Qn1、TC1 和 Pass?这是高度非描述性的。主表和明细表的列连接是什么? 样本数据最好使用DDL + DML。请edit您的问题包括它,您当前的尝试和您想要的结果。 @ZoharPeled 对不起,更新了我的表结构,你现在可以看看吗 【参考方案1】:

您可以使用通用表表达式和条件聚合来获得所需的结果。

首先,创建并填充示例表(在您以后的问题中保存我们这一步):

DECLARE @ResultMaster AS TABLE
(
    QnID int, 
    Description char(3)
);

INSERT INTO @ResultMaster (QnID, Description) VALUES
(1, 'Qn1'),
(2, 'Qn2'),
(3, 'Qn3'),
(4, 'Qn4'),
(5, 'Qn5');

DECLARE @ResultDetails AS TABLE
(
    ID int, 
    QnID int, 
    TCDesc char(3),
    Result char(4)
);

INSERT INTO @ResultDetails VALUES
(1, 1, 'TC1', 'PASS'),
(2, 1, 'TC2', 'FAIL'),
(3, 1, 'TC3', 'PASS'),
(4, 2, 'TC1', 'PASS'),
(5, 3, 'TC1', 'PASS'),
(6, 3, 'TC1', 'PASS'),
(7, 3, 'TC3', 'PASS');

然后,使用公表表达式计算通行明细数,简单计数即可得到总明细数:

WITH CTE AS
(
SELECT  M.QnId, 
        COUNT(CASE WHEN Result = 'PASS' THEN 1 END) As CountPass, 
        COUNT(Result) As CountDetails
FROM @ResultMaster As M
LEFT JOIN @ResultDetails As D ON M.QnId = D.QnId
GROUP BY M.QnId
)

然后,从那个 cte 中选择:

SELECT  ROW_NUMBER() OVER(ORDER BY QnId) AS Id,
        QnId,
        CASE WHEN CountDetails = 0 THEN 
            'ERROR'
        ELSE
            'PASS'
        END
FROM CTE
WHERE CountPass = CountDetails

结果:

+----+------+--------+
| ID | QnID | Result |
+----+------+--------+
|  1 |    2 | PASS   |
|  2 |    3 | PASS   |
|  3 |    4 | ERROR  |
|  4 |    5 | ERROR  |
+----+------+--------+

You can see a live demo on rextester.

【讨论】:

以上是关于用于计算记录数的 SQL 查询必须与记录总数匹配的主要内容,如果未能解决你的问题,请参考以下文章

如何使用sql函数平均值总数最小值最大值

一条sql语句实现分页查询,且能返回记录总数

SQL 查询记录数的SQL语句

如何显示每周发生并满足某些条件的记录总数 SQL

sql语句去重

根据PHP中的ENUM值计算数据库中的记录总数