按 2 个不同日期周期进行的 CTE 聚合

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

我有以下示例数据和所需的输出,我编写的 SQL 查询并没有完全产生我正在寻找的结果,我不明白为什么。我尝试过不同的分组,聚合或不聚合“单位”列,但似乎没有任何效果。任何帮助将不胜感激。

样本数据:

已赚问:

活动ID 已获得MH_I 期间_WE
CS0001 206.79 2023 年 5 月 27 日
CS0001 41.35 2023 年 6 月 10 日

计划问:

活动ID 已获得MH_I 期间_WE
CS0001 41.36 2023 年 5 月 20 日
CS0001 41.36 2023 年 5 月 27 日
CS0001 33.09 2023 年 6 月 3 日
CS0001 41.36 2023 年 6 月 10 日

期间Q:

周末 期间_WE
2023 年 5 月 20 日 2023 年 5 月 27 日
2023 年 5 月 27 日 2023 年 5 月 27 日
2023 年 6 月 3 日 2023 年 6 月 10 日
2023 年 6 月 10 日 2023 年 6 月 10 日

我尝试过的SQL:

WITH AggregatedEarnedHours AS (
    SELECT
        WBS,
        ActivityID,
        Period_WE,
        SUM(EarnedMH_I) AS EarnedHours
    FROM
        EarnedQ
    GROUP BY
        WBS,
        ActivityID,
        Period_WE
),
AggregatedPlannedHours AS (
    SELECT
        AID,
        EOW2 AS Period_WE,
        SUM(Units) AS PlannedHours
    FROM 
        PlannedQ T
        JOIN PeriodQ P ON T.Weekending = P.Period_WE
    GROUP BY
        AID,
        EOW2
)
SELECT
    E.WBS,
    E.ActivityID,
    E.Period_WE,
    SUM(E.EarnedHours) AS EarnedHours,
    ISNULL(P.PlannedHours, 0) AS PlannedHours
FROM 
    AggregatedEarnedHours E
LEFT JOIN AggregatedPlannedHours P ON E.ActivityID = P.AID AND E.Period_WE = P.Period_WE
GROUP BY 
    E.WBS,
    E.ActivityID,
    E.Period_WE,
    P.PlannedHours
HAVING (SUM(E.EarnedHours) != 0 OR SUM(P.PlannedHours) !=0) AND 
    SUM(E.EarnedHours) > 0

电流输出:

活动ID 已获得MH_I 单位 周末
CS0001 206.79 579.04 2023 年 5 月 27 日
CS0001 41.35 521.15 2023 年 6 月 10 日

所需输出:

活动ID 已获得MH_I 单位 周末
CS0001 206.79 82.72 2023 年 5 月 27 日
CS0001 41.35 74.45 2023 年 6 月 10 日

正如你所看到的,它几乎可以工作,但是计划的时间太长了。我有一种感觉,这与错误地进行聚合或分组有关。另外,为了发布,这些数据被缩写了,所有表中都有更多行,但您明白了。请注意,PlannedQ 是每周数据,而我在这里尝试每两周分组一次。按双周进行手动分组不适合我的解决方案,因为在其他情况下我也需要按月进行分组并且需要动态的内容,因此包含了 periodQ 表。

sql sql-server view common-table-expression
© www.soinside.com 2019 - 2024. All rights reserved.