You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 14:36:21