聚合:SQL 子查询中缺少类别

问题描述 投票:0回答:1

我的基础数据:

进程ID 地点 日期 时效性
2030608 纽约 5月24日 及时
2067393 俄亥俄州 5月24日 逾期
1329306 俄亥俄州 5月24日 及时
1740814 俄亥俄州 6 月 24 日 逾期
1924676 芝加哥 5月24日 逾期
1985313 芝加哥 5月24日 逾期
1715694 旧金山 6 月 24 日 及时
1981887 旧金山 6 月 24 日 逾期
1752416 旧金山 7 月 24 日 逾期
1671006 纽约 5月24日 及时
2030607 纽约 6 月 24 日 及时

我想聚合它以在可视化工具中使用它。

我的聚合查询的当前输出:

地点 日期 银泰时代 总计 百分比
纽约 5月24日 3 3 100
俄亥俄州 5月24日 1 2 50
旧金山 6 月 24 日 1 2 50

我的问题:某些数据从聚合中删除,因为该位置和月份没有 intime 进程。

我需要的输出:(直接来自上面的基础数据)

地点 日期 银泰时代 总计 百分比
纽约 5月24日 3 3 100
俄亥俄州 5月24日 1 2 50
俄亥俄州 6 月 24 日 0 1 0
旧金山 6 月 24 日 1 2 50
旧金山 7月24日 0 1 0
芝加哥 5月24日 0 2 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
            mapping, 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
sql sql-server group-by subquery rollup
1个回答
0
投票

如果使用条件聚合,查询会简单得多。

SELECT *, ROUND(intime/total*100, 0) as percentage
FROM
    (SELECT Location, 
           [Date], 
           SUM(CASE WHEN Timeliness='in time' THEN 1 ELSE 0 END) as intime,
           COUNT(*) as total
    FROM YourTable
    GROUP BY Location, `Date`) agg 
;      

以上未在 SQL Server 中测试。

© www.soinside.com 2019 - 2024. All rights reserved.