SQL关联3张测试结果表生成报表看板的聚合查询问题
问题说明
- 现有3张独立存储测试执行结果的数据表,分别存放状态为
PASS、FAIL、SKIP的测试用例记录,需要基于三张表共有的BUILD_NUMBER、COMPONENT字段聚合数据,生成测试报表看板。 - 原有查询使用内连接关联表,无法得到正确统计结果,原错误写法如下:
select test_execution.COMPONENT, test_execution.BUILD_NUMBER, count(test_execution.TEST_STATUS) as PASS from (test_execution INNER JOIN test_execution_fail ON test_execution.BUILD_NUMBER = test_execution_fail.BUILD_NUMBER) group by COMPONENT,BUILD_NUMBER;
- 预期输出需包含
BUILD_NUMBER、COMPONENT、TOTAL、PASS、FAIL、SKIP6个字段,分别对应当前构建号+组件维度下的总用例数、通过用例数、失败用例数、跳过用例数。
表结构与基础数据说明
- 三张表结构完全一致,其中
test_execution_skip建表语句如下:
CREATE TABLE test_execution_skip ( BUILD_NUMBER int, TEST_NAME varchar(255), TEST_CLASS varchar(255), COMPONENT varchar(255), TEST_STATUS varchar(255) );
test_execution表全量存储PASS状态记录,共3条;test_execution_fail表全量存储FAIL状态记录,共2条;test_execution_skip表存储SKIP状态记录,共1条。
正确SQL实现
原有内连接写法会产生笛卡尔积,导致统计数值虚高。正确逻辑为先合并三张表的全量记录,再按维度分组聚合统计,写法如下:
SELECT BUILD_NUMBER, COMPONENT, COUNT(*) AS TOTAL, SUM(CASE WHEN TEST_STATUS = 'PASS' THEN 1 ELSE 0 END) AS PASS, SUM(CASE WHEN TEST_STATUS = 'FAIL' THEN 1 ELSE 0 END) AS FAIL, SUM(CASE WHEN TEST_STATUS = 'SKIP' THEN 1 ELSE 0 END) AS SKIP FROM ( SELECT BUILD_NUMBER, COMPONENT, TEST_STATUS FROM test_execution UNION ALL SELECT BUILD_NUMBER, COMPONENT, TEST_STATUS FROM test_execution_fail UNION ALL SELECT BUILD_NUMBER, COMPONENT, TEST_STATUS FROM test_execution_skip ) AS all_test_cases GROUP BY BUILD_NUMBER, COMPONENT;
逻辑说明:通过
UNION ALL将三张表的所有测试记录合并为统一结果集,彻底规避多表JOIN产生的行重复乘积问题;再按BUILD_NUMBER+COMPONENT维度分组,用条件求和分别统计各状态的用例数量,总用例数直接统计分组内的总行数即可,输出结果完全匹配预期字段和统计要求。
内容的提问来源于stack exchange,提问作者RISHI KHANNA
相关产品推荐
相关产品推荐

