SQL如何将同表两列测试总数字段合并为单个Total_Test字段
方案说明
你可以通过UNION/UNION ALL(也支持先把中间结果存入临时表再做拼接)实现字段纵向堆叠的需求,但无法通过CASE语句实现该需求:CASE属于行级逻辑运算,仅能对每行的单个输出字段做值判断,无法将1行数据拆分为2行实现纵向堆叠。
如果没有去重需求,更推荐使用UNION ALL,性能远高于需要全局去重的UNION,也和你给出的示例效果匹配。
改造后的查询语句
WITH cte AS ( SELECT ID, TEST_DATE, CATEGORY_A_TOTAL_TEST, CATEGORY_B_TOTAL_TEST, RIGHT(TEST_DATE,4) AS Test_year FROM TESTS ) SELECT t.ID, t.TEST_DATE, t.Test_year, t.Total_Test, b.Average, b.NationalAverage FROM ( -- 提取CATEGORY_A的测试值 SELECT ID, TEST_DATE, Test_year, CATEGORY_A_TOTAL_TEST AS Total_Test FROM cte UNION ALL -- 提取CATEGORY_B的测试值 SELECT ID, TEST_DATE, Test_year, CATEGORY_B_TOTAL_TEST AS Total_Test FROM cte ) t LEFT JOIN Averages b ON t.Test_year = b.Test_Year
如果需要区分堆叠后每个数值的原始来源,可以在子查询中加一个类别标识字段:
-- 子查询部分示例 SELECT ID, TEST_DATE, Test_year, 'A' AS Category_Type, CATEGORY_A_TOTAL_TEST AS Total_Test FROM cte UNION ALL SELECT ID, TEST_DATE, Test_year, 'B' AS Category_Type, CATEGORY_B_TOTAL_TEST AS Total_Test FROM cte
内容的提问来源于stack exchange,提问作者EMW
相关产品推荐
相关产品推荐

