【问题标题】:How to calculate total 6 months in Oracle SQL?如何在 Oracle SQL 中计算总共 6 个月?
【发布时间】:2021-08-21 07:14:12
【问题描述】:

我试试这个 SQL 语句:

SELECT
    custodycd,
    SUM(mramt) mramt_6_month,
    txdate,
    CASE    
        WHEN LAG(mramt, 6) OVER (ORDER BY txdate) IS NOT NULL
            THEN SUM(mramt) OVER (ORDER BY txdate ROWS BETWEEN 6 PRECEDING AND 1 PRECEDING)
        ELSE NULL 
    END AS mramt_6_month_1
FROM
    (SELECT
         MAX(mramt) mramt,
         t.afacctno,
         t.custodycd,
         t.txdate 
     FROM
         tbl_mr3007_log t 
     WHERE
         txdate >= '30/nov/2020' 
         AND mramt <> 0 
     GROUP BY
         t.afacctno,
         t.txdate,
         t.custodycd) 
GROUP BY
    custodycd,
    txdate 
ORDER BY
    txdate 

我得到一个错误:

ORA-00979: 不是 GROUP BY 表达式

感谢您的帮助

【问题讨论】:

  • 您能否具体说明您想通过查询实现什么,以及预期的结果?请检查stackoverflow.com/help/how-to-ask 以提出正确的问题。
  • 条件WHERE txdate &gt;= '30/nov/2020' 似乎非常很糟糕。如果你真的像这个字符串一样存储日期值,结果将是废话!
  • 错误原因是LAG(mramt, 6)的存在。由于mramt 列既没有保留在 GROUP BY 列表中,也没有对其应用聚合函数。

标签: sql oracle oracle11g


【解决方案1】:

错误信息看起来很清楚。但是,你想做什么并不清楚。

我猜对于每个custodycd,您都有多行日期。从第七行开始,您需要前六行的总和。

如果是,那么代码如下:

(CASE WHEN ROW_NUMBER() OVER (PARTITION BY custodycd ORDER BY txdate) > 6
      THEN SUM(SUM(mramt)) OVER (PARTITION BY custodycd
                                 ORDER BY txdate
                                 ROWS BETWEEN 6 PRECEDING AND 1 PRECEDING
                                )
 END) AS mramt_6_month_1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-13
    • 2021-03-16
    • 2021-10-09
    • 2016-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多