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

如何关联两个CTE并通过GROUP BY生成正确的汇总结果?

问题:关联两个CTE后统计列结果全为0,无法得到预期汇总表

背景说明

两个CTE派生自同一张表:

  • open_bridges:筛选条件为Structure Code IN ('F')
  • gikl_all_strucs:筛选条件为Structure Code IN ('G','I','K','L')

open_bridges的前24行样本数据:

结构类型(Structure Type)建造年份(Year Built)结构代码(Structure Code)状态授予日期(Status Granted Date)
BRIDGE1958F12/6/2016
TUNNEL1961L3/28/2022
BRIDGE1999F1/9/2002
RWALL1998I4/17/2000
BRIDGE2014F11/7/2018
BRIDGE2017G5/08/2020
BRIDGE2012K1/9/2017
RWALL2003F3/07/2007
BRIDGE1999F2/24/2011
BRIDGE2006K6/02/2017
BRIDGE2008F9/24/2019
TUNNEL2000F4/17/2016
TUNNEL2011I11/7/2018
BRIDGE2013G5/08/2020
BRIDGE2017F1/9/2020
RWALL2003F3/07/2005
TUNNEL2011I11/7/2018
BRIDGE2013G5/08/2020
BRIDGE2017F1/9/2020
RWALL2003F3/07/2005
TUNNEL2016K12/5/2019
RWALL2014F8/05/2016
RWALL2015F1/9/2021
BRIDGE2017K3/03/2022

单独查询的正确结果

查询1:统计各结构类型下建造年份≤对应年份的数量

SELECT 
      oba.Structure_type,
     SUM(CASE WHEN oba.YEAR_BUILT<='2016' OR oba.YEAR_BUILT IS NULL THEN 1 ELSE 0 END) AS y2016,
     SUM(CASE WHEN oba.YEAR_BUILT<='2017' OR oba.YEAR_BUILT IS NULL THEN 1 ELSE 0 END) AS y2017,
     SUM(CASE WHEN oba.YEAR_BUILT<='2018' OR oba.YEAR_BUILT IS NULL THEN 1 ELSE 0 END) AS y2018,
     SUM(CASE WHEN oba.YEAR_BUILT<='2019' OR oba.YEAR_BUILT IS NULL THEN 1 ELSE 0 END) AS y2019,
     SUM(CASE WHEN oba.YEAR_BUILT<='2020' OR oba.YEAR_BUILT IS NULL THEN 1 ELSE 0 END) AS y2020,
     SUM(CASE WHEN oba.YEAR_BUILT<='2021' OR oba.YEAR_BUILT IS NULL THEN 1 ELSE 0 END) AS y2021,
     SUM(CASE WHEN oba.YEAR_BUILT<='2022' OR oba.YEAR_BUILT IS NULL THEN 1 ELSE 0 END) AS y2022,
     SUM(CASE WHEN oba.YEAR_BUILT<='2023' OR oba.YEAR_BUILT IS NULL THEN 1 ELSE 0 END) AS y2023
    FROM open_bridges oba 
    GROUP BY oba.structure_type
    ORDER BY oba.structure_type DESC

查询结果:

结构类型(Structure_type)y2016y2017y2018y2019y2020y2021y2022y2023
TUNNEL34444555
RWALL55666666
BRIDGE610121313131313

查询2:统计各结构类型下状态授予日期年份≥2016的数量

SELECT 
            gika.Structure_type,
            SUM(CASE WHEN EXTRACT(YEAR FROM gika.status_granted_date) >='2016' THEN 1 ELSE 0 END) AS gik2016
FROM gikl_all_strucs gika
GROUP BY gika.structure_type

查询结果:

结构类型(Structure_type)gik2016
BRIDGE13
RWALL5
TUNNEL4

关联查询的问题

尝试通过LEFT JOIN关联两个CTE并GROUP BY时,gik2016列全为0,使用的SQL语句如下:

SELECT 
     oba.STructure_type,
     SUM(CASE WHEN oba.YEAR_BUILT<='2016' OR oba.YEAR_BUILT IS NULL THEN 1 ELSE 0 END) AS y2016,
     SUM(CASE WHEN EXTRACT(YEAR FROM gika.current_status_granted_date) >='2016' THEN 1 ELSE 0 END) AS gik2016,            
     SUM(CASE WHEN oba.YEAR_BUILT<='2017' OR oba.YEAR_BUILT IS NULL THEN 1 ELSE 0 END) AS y2017,
     SUM(CASE WHEN oba.YEAR_BUILT<='2018' OR oba.YEAR_BUILT IS NULL THEN 1 ELSE 0 END) AS y2018,
     SUM(CASE WHEN oba.YEAR_BUILT<='2019' OR oba.YEAR_BUILT IS NULL THEN 1 ELSE 0 END) AS y2019,
     SUM(CASE WHEN oba.YEAR_BUILT<='2020' OR oba.YEAR_BUILT IS NULL THEN 1 ELSE 0 END) AS y2020,
     SUM(CASE WHEN oba.YEAR_BUILT<='2021' OR oba.YEAR_BUILT IS NULL THEN 1 ELSE 0 END) AS y2021,
     SUM(CASE WHEN oba.YEAR_BUILT<='2022' OR oba.YEAR_BUILT IS NULL THEN 1 ELSE 0 END) AS y2022,
     SUM(CASE WHEN oba.YEAR_BUILT<='2023' OR oba.YEAR_BUILT IS NULL THEN 1 ELSE 0 END) AS y2023
FROM open_bridges oba LEFT JOIN gikl_all_strucs gika 
                ON oba.structure_type=gika.structure_type 
                        AND oba.structure_no=gika.structure_no 
                        AND oba.year_built=gika.year_built 
                        AND oba.structure_status_type_code=gika.structure_status_type_code
    GROUP BY oba.structure_type
    ORDER BY oba.structure_type DESC

预期汇总表:

结构类型(Structure_type)y2016gik2016y2017y2018y2019y2020y2021y2022y2023
TUNNEL344444555
RWALL556666666
BRIDGE61310121313131313

修正方案

问题原因

  1. 关联条件过于严格:两个CTE的Structure Code互斥(一个为F,一个为G/I/K/L),通过structure_no、year_built等字段关联不会有匹配数据,导致gika表字段全为NULL,SUM计算结果为0。
  2. 字段名错误:查询2使用status_granted_date,但关联查询中误写为current_status_granted_date,字段不匹配。

修正后的SQL

WITH open_bridges_stats AS (
    SELECT 
        oba.Structure_type,
        SUM(CASE WHEN oba.YEAR_BUILT<='2016' OR oba.YEAR_BUILT IS NULL THEN 1 ELSE 0 END) AS y2016,
        SUM(CASE WHEN oba.YEAR_BUILT<='2017' OR oba.YEAR_BUILT IS NULL THEN 1 ELSE 0 END) AS y2017,
        SUM(CASE WHEN oba.YEAR_BUILT<='2018' OR oba.YEAR_BUILT IS NULL THEN 1 ELSE 0 END) AS y2018,
        SUM(CASE WHEN oba.YEAR_BUILT<='2019' OR oba.YEAR_BUILT IS NULL THEN 1 ELSE 0 END) AS y2019,
        SUM(CASE WHEN oba.YEAR_BUILT<='2020' OR oba.YEAR_BUILT IS NULL THEN 1 ELSE 0 END) AS y2020,
        SUM(CASE WHEN oba.YEAR_BUILT<='2021' OR oba.YEAR_BUILT IS NULL THEN 1 ELSE 0 END) AS y2021,
        SUM(CASE WHEN oba.YEAR_BUILT<='2022' OR oba.YEAR_BUILT IS NULL THEN 1 ELSE 0 END) AS y2022,
        SUM(CASE WHEN oba.YEAR_BUILT<='2023' OR oba.YEAR_BUILT IS NULL THEN 1 ELSE 0 END) AS y2023
    FROM open_bridges oba 
    GROUP BY oba.structure_type
),
gikl_stats AS (
    SELECT 
        gika.Structure_type,
        SUM(CASE WHEN EXTRACT(YEAR FROM gika.status_granted_date) >=2016 THEN 1 ELSE 0 END) AS gik2016
    FROM gikl_all_strucs gika
    GROUP BY gika.structure_type
)
SELECT 
    os.Structure_type,
    os.y2016,
    COALESCE(gs.gik2016, 0) AS gik2016,
    os.y2017,
    os.y2018,
    os.y2019,
    os.y2020,
    os.y2021,
    os.y2022,
    os.y2023
FROM open_bridges_stats os
LEFT JOIN gikl_stats gs ON os.Structure_type = gs.Structure_type
ORDER BY os.Structure_type DESC;

修正要点

  • 先分别对两个CTE按structure_type完成统计,得到各自的汇总结果
  • 仅通过structure_type关联两个汇总表,避免原始数据无匹配的问题
  • 使用COALESCE处理NULL值,确保无匹配时显示0
  • 修正字段名错误,将current_status_granted_date改回status_granted_date

内容的提问来源于stack exchange,提问作者ar ia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 04:03:11