用于计算记录数的 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 查询必须与记录总数匹配的主要内容,如果未能解决你的问题,请参考以下文章