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

SQL子查询聚合缺失分类数据:需保留无及时流程的位置日期记录

问题:补全无及时流程的位置-日期聚合记录

现有基础数据表包含Process ID、Location、Date、Timeliness字段,需聚合后用于可视化工具。当前SQL查询使用ROLLUP分组与INNER JOIN,会缺失某位置某日期下无in time流程的记录(如Ohio June 24、Chicago May 24等),要求这类记录显示intime=0、total=对应流程总数、percentage=0。

原查询语句

SELECT
    gesamt2.Location,
    gesamt2.date,
    intime2.anzahl AS intime,
    gesamt2.anzahl AS total,

    CAST(intime2.anzahl AS float) / CAST(gesamt2.anzahl AS float) * 100 AS percentage

FROM
    (
        SELECT
            location,
            anzahl,
            date
        FROM
            (
                SELECT
                    Location,
                    Date,
                    timeliness,
                    COUNT(1) AS anzahl
                FROM
                    basedata
                GROUP BY ROLLUP (Location, Date, Timeliness)
            ) AS gesamt
        WHERE
            (timeliness IS NULL)
    ) AS gesamt2
    INNER JOIN
    (
        SELECT
            Location, anzahl, date
        FROM
            (
                SELECT
                    Location,
                    Date,
                    timeliness,
                    COUNT(1) AS anzahl
                FROM
                    basedata
                WHERE
                    (BASE_FINAL_APPROVAL > GETDATE() - 366)
                GROUP BY ROLLUP (Location, Date, timeliness)
            ) AS intime
        WHERE
            (timeliness = 'in time')
    ) AS intime2 ON
        gesamt2.Location = intime2.Location
        AND
        gesamt2.date = intime2.date

修改后查询语句

SELECT
    gesamt2.Location,
    gesamt2.date,
    -- 无匹配时intime显示0
    ISNULL(intime2.anzahl, 0) AS intime,
    gesamt2.anzahl AS total,
    -- 无及时流程时百分比直接为0,避免空值计算错误
    CASE
        WHEN ISNULL(intime2.anzahl, 0) = 0 THEN 0
        ELSE CAST(intime2.anzahl AS float) / CAST(gesamt2.anzahl AS float) * 100
    END AS percentage

FROM
    (
        SELECT
            location,
            anzahl,
            date
        FROM
            (
                SELECT
                    Location,
                    Date,
                    timeliness,
                    COUNT(1) AS anzahl
                FROM
                    basedata
                GROUP BY ROLLUP (Location, Date, Timeliness)
            ) AS gesamt
        WHERE
            (timeliness IS NULL)
    ) AS gesamt2
    -- 改用LEFT JOIN保留所有位置-日期的总流程记录
    LEFT JOIN
    (
        SELECT
            Location, anzahl, date
        FROM
            (
                SELECT
                    Location,
                    Date,
                    timeliness,
                    COUNT(1) AS anzahl
                FROM
                    basedata
                WHERE
                    (BASE_FINAL_APPROVAL > GETDATE() - 366)
                GROUP BY ROLLUP (Location, Date, timeliness)
            ) AS intime
        WHERE
            (timeliness = 'in time')
    ) AS intime2 ON
        gesamt2.Location = intime2.Location
        AND
        gesamt2.date = intime2.date

修改说明

  • 将INNER JOIN替换为LEFT JOIN:确保gesamt2中所有的位置-日期记录都被保留,即使没有对应的in time流程数据
  • 用ISNULL(intime2.anzahl, 0)处理空值:当没有匹配的in time记录时,将intime字段设为0
  • 新增CASE分支计算percentage:避免因intime为空导致的计算错误,直接将无及时流程的百分比设为0

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 12:06:08