【问题标题】:Struggling with Running Sum query in SQL在 SQL 中运行 Sum 查询时苦苦挣扎
【发布时间】:2020-08-06 23:56:01
【问题描述】:

我正在为这个查询而苦苦挣扎。它正在正确计算第一个仓库的运行总和,但是一旦它到达下一个仓库,它应该再次从零开始计算运行总和,但它继续前一个仓库的结束总数,我做错了什么?

这是我的查询,我还添加了输出图像。

SELECT 
    Depot
    ,WorkDayNr
    ,DayOfMonth
    ,Tons
    ,SUM (Tons) OVER (ORDER BY Depot, WorkDayNr) AS RunTotal
FROM #Final
GROUP BY Depot, WorkDayNr, DayOfMonth, Tons
ORDER BY Depot, WorkDayNr

【问题讨论】:

  • 请用您正在使用的数据库标记您的问题:mysql、oracle、postgresql...?

标签: sql database sum window-functions cumulative-sum


【解决方案1】:

只需在窗口函数中添加partition。结果集中列的名称与查询不匹配,所以我怀疑你想要Depot 而不是SubGrp

SUM (Tons) OVER (PARTITION BY Depot ORDER BY WorkDayNr) AS RunTotal

另外,我看不出在这个查询中使用聚合的意义。您似乎混淆了聚合函数(SUM() 没有 OVER() 子句),它需要聚合和窗口函数。就问题而言,您的查询应该是:

SELECT 
    Depot,
    WorkDayNr,
    DayOfMonth,
    Tons,
    SUM (Tons) OVER (PARTITION BY Depot ORDER BY WorkDayNr) AS RunTotal
FROM #Final
ORDER BY Depot, WorkDayNr

【讨论】:

    【解决方案2】:

    你应该按仓库分区:

    SELECT 
        Depot,
        WorkDayNr,
        DayOfMonth,
        Tons,
        SUM(Tons) OVER (PARTITION BY Depot ORDER BY WorkDayNr) AS RunTotal
    FROM #Final
    ORDER BY
        Depot,
        WorkDayNr;
    

    还请注意,您的 GROUP BY 子句可能是多余且不必要的,因为您实际上并未选择任何聚合。使用SUM作为解析函数时,聚合已经卷入其中,无需使用GROUP BY

    【讨论】:

      【解决方案3】:

      添加partition子句:

       SUM (Tons) OVER (PARTITION BY SUBGROUP ORDER BY Depot, WorkDayNr) AS RunTotal
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-01-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-20
        相关资源
        最近更新 更多