首页 > 解决方案 > ORACLE SQL:按天时间和金额总和分组的每小时日期

问题描述

我有以下情况:

ID                DATE_TIME             AMOUNT
23     14-MAY-2021 10:47:01               5
23     14-MAY-2021 11:49:52               3
23     14-MAY-2021 12:03:18               4

如何获得金额的总和并按天而不是按小时计算 DATE?

例子:

ID                DATE_TIME           TOTAL
23                20210514             12

我尝试过这种方式,但出现错误:

SELECT DISTINCT ID, TO_CHAR(DATE_TIME, 'YYYYMMDD'), SUM(AMOUNT) AS TOTAL FROM MY_TABLE
WHERE ID ='23' AND DATE_TIME > SYSDATE-1
GROUP BY TOTAL, DATE_TIME

标签: sqloracledate

解决方案


如果您使用 GROUP BY,则不需要 DISTINCT - 分组的任何内容都必须是不同的,除非它稍后加入其他内容导致它再次重复

你也快到了

SELECT ID, TO_CHAR(DATE_TIME, 'YYYYMMDD') AS DATE_TIME, SUM(AMOUNT) AS TOTAL 
FROM MY_TABLE
WHERE ID ='23' AND DATE_TIME > SYSDATE-1
GROUP BY ID, TO_CHAR(DATE_TIME, 'YYYYMMDD')

您需要按函数的输出而不是输入进行分组。并非每个数据库都可以在选择中使用 GROUP BY 别名(从技术上讲,在 GROUP 完成时 SELECT 尚未完成,因此别名还不存在,并且您不会按总数分组,因为这是一个聚合(结果总结组中的每个不同的值)


如果您需要对该日期进行进一步处理,请不要将其转换为字符串。使用 TRUNC 缩短时间:

SELECT ID, TRUNC(DATE_TIME) as DATE_TIME, SUM(AMOUNT) AS TOTAL 
FROM MY_TABLE
WHERE ID ='23' AND DATE_TIME > SYSDATE-1
GROUP BY ID, TRUNC(DATE_TIME)

TRUNC 可以将日期缩减到其他部分,例如 TRUNC(DATE_TIME, 'HH24') 将删除分钟和秒,但保留小时


推荐阅读