【问题标题】:Cumulative sum with expression in oracleoracle中带表达式的累积和
【发布时间】:2018-07-05 18:46:28
【问题描述】:

我正在尝试使用以下查询获得累积总和:

SELECT to_char(INVC_DT, 'MON-YYYY') AS MONTH 
       ,SUM(INVC_AMT)
       /*, here I need a third column with the cumulative sum of the second column*/
FROM T_INVC_INFO I INNER JOIN T_TASK_INFO T ON I.TASK_ID = T.TASK_ID
WHERE T.CNTRCT_ID = #session.user.cntrct_id#
GROUP BY to_char(INVC_DT, 'MON-YYYY')
ORDER BY MONTH DESC

【问题讨论】:

    标签: sql oracle select sum


    【解决方案1】:

    我会这样做:

    SELECT to_char(INVC_DT, 'MON-YYYY') AS MONTH,
           SUM(INVC_AMT),
           SUM(SUM(INVC_AMT)) OVER (ORDER BY MIN(INVC_DT))
    FROM T_INVC_INFO I INNER JOIN T_TASK_INFO T ON I.TASK_ID = T.TASK_ID
    WHERE T.CNTRCT_ID = #session.user.cntrct_id#
    GROUP BY to_char(INVC_DT, 'MON-YYYY')
    ORDER BY MONTH DESC;
    

    注意ORDER BY 子句是按日期而不是按字母顺序按月份。

    您可能还希望ORDER BY MIN(INVC_DT) 获得最终订单。

    【讨论】:

    • 你说得对,我用的测试数据太小了。您的答案ORDER BY MIN(INVC_DT) 中的排序是正确的。
    【解决方案2】:

    我会用另一个查询包装这个查询并使用 sum 的窗口变体:

    SELECT   month, sum_month, SUM(sum_month) OVER (ORDER BY month DESC)
    FROM     (SELECT     TO_CHAR(invc_dt, 'MON-YYYY') AS month,
                         SUM(invc_amt) AS sum_month
              FROM       t_invc_info i
              INNER JOIN t_task_info t ON i.task_id = t.task_id
              WHERE      t.cntrct_id = #session.user.cntrct_id#
              GROUP BY   TO_CHAR(invc_dt, 'MON-YYYY'))
    ORDER BY month DESC
    

    【讨论】:

    • @alanfcm 。 . .我很惊讶你接受了这个答案,因为累积总和是基于月份的字母顺序而不是时间。我希望时间成为意图。
    猜你喜欢
    • 1970-01-01
    • 2021-02-02
    • 2015-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多