【问题标题】:Sum Field Depends on Group by Month and Year from Date总和字段取决于从日期开始按月和年分组
【发布时间】:2019-09-04 06:55:14
【问题描述】:

我有一张桌子的样子。

tbl_work:

ACCOUNT        TOTAL        LAST_UPDATE_DATE
============================================== 
21157         3779444      2018-01-02 00:00:00
21157         7200000      2018-01-04 00:00:00
21157         131275053    2018-02-01 00:00:00
21157         6646465      2018-02-02 00:00:00
21157         36268657     2018-03-01 00:00:00
21157         3622400      2018-03-02 00:00:00
21157         17201657     2018-04-04 00:00:00
21157         3549999      2018-04-07 00:00:00
21157         14364000     2018-05-02 00:00:00
21157         77726800     2018-05-04 00:00:00

这将按完整的 DateTime 分组,包括日期、小时和分钟。我希望仅按月和年 MM/YYYY 进行分组,并对其进行一些 SUM。

到目前为止,我已经尝试过:

SELECT ACCOUNT, SUM(total) AS TOTAL, TRUNC(created_date) AS LAST_UPDATE_DATE
FROM rkap_realisasi
WHERE account = '21157' 
AND TRUNC(created_date) BETWEEN TO_DATE('1/1/2018', 'MM/DD/YYYY') AND TO_DATE('1/1/2019','MM/DD/YYYY')
GROUP BY account, EXTRACT(YEAR_MONTH FROM(TRUNC(created_date)))

但似乎效果不佳。

我的预期输出是:

ACCOUNT        TOTAL        LAST_UPDATE_DATE
============================================= 
21157         10979444      2018-01-04 00:00:00
21157         137921518     2018-02-01 00:00:00
21157         39891057      2018-03-02 00:00:00
21157         20751656      2018-04-07 00:00:00
21157         92090800      2018-05-04 00:00:00 

任何深思熟虑的建议将不胜感激。

谢谢。

【问题讨论】:

  • 我确信 YEAR_MONTH 不是 Oracle 中 EXTRACT 的有效输入。或者如果是,请告诉我这个提取物的输出是什么?

标签: sql oracle


【解决方案1】:

您只需要使用以下查询按月和年分组:

SELECT ACCOUNT, SUM(total) AS TOTAL, max(created_date) AS LAST_UPDATE_DATE
FROM rkap_realisasi
WHERE account = '21157' 
AND TRUNC(created_date) BETWEEN TO_DATE('1/1/2018', 'MM/DD/YYYY') AND TO_DATE('1/1/2019','MM/DD/YYYY')
GROUP BY account, TRUNC(created_date, 'month')

干杯!!

【讨论】:

  • 2019 年 1 月 1 日会怎样?
  • 不,对不起,我绊倒了。我曾认为使用月份参数是不够的,但经过测试,似乎还可以(+1)。
【解决方案2】:

使用 max() 作为日期

SELECT ACCOUNT, SUM(total) AS TOTAL, max(TRUNC(created_date)) AS LAST_UPDATE_DATE
FROM rkap_realisasi
WHERE account = '21157' 
AND TRUNC(created_date) BETWEEN TO_DATE('1/1/2018', 'MM/DD/YYYY') AND TO_DATE('1/1/2019','MM/DD/YYYY')
GROUP BY account,EXTRACT(YEAR_MONTH FROM(TRUNC(created_date)))

【讨论】:

    【解决方案3】:

    您可以使用TO_CHAR() 函数和'YYYYMM' 参数进行分组:

    SELECT account,
           TO_CHAR(created_date,'YYYYMM'),
           SUM(total) AS TOTAL,
           MAX(TRUNC(created_date)) AS LAST_UPDATE_DATE
      FROM rkap_realisasi
     WHERE account = '21157'
       AND TRUNC(created_date) BETWEEN DATE'2018-01-01' AND DATE'2019-01-01'
     GROUP BY account, TO_CHAR(created_date,'YYYYMM')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-28
      • 2017-01-11
      • 2022-12-11
      • 2016-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多