如何在Oracle SQL中按周统计列计数?附现有按月分组代码
Oracle按周分组统计SQL实现
问题背景
原有按月分组统计的Oracle SQL如下:
select project_name, to_char (date_sys, 'Month') as Month, sum(BATCH.RECORDS_NUMBER) as Count_of_Documents from BATCH group by project_name, to_char(date_sys, 'Month');
需要修改为按周分组,输出格式要求为YYYY-MM-DD格式的周起始日期+文档计数,且结果按日期排序。此前尝试使用DATE_FORMAT/DATEPART函数触发ORA-00904错误,这是因为这两个是MySQL专属函数,Oracle不支持。
正确实现代码
以下是符合需求的Oracle SQL代码,默认以周一作为每周起始(ISO周标准):
SELECT TO_CHAR(TRUNC(date_sys, 'IW'), 'YYYY-MM-DD') AS week, SUM(RECORDS_NUMBER) AS Count FROM BATCH GROUP BY TRUNC(date_sys, 'IW') ORDER BY TRUNC(date_sys, 'IW');
关键说明
- 周起始规则调整:
- 若需以周日作为每周起始,将
TRUNC(date_sys, 'IW')替换为TRUNC(date_sys, 'DAY') - 若需以每年1月1日所在周为第一周,替换为
TRUNC(date_sys, 'WW')
- 若需以周日作为每周起始,将
- 排序逻辑:直接按
TRUNC处理后的日期字段排序,比格式化后的字符串排序更准确可靠 - 分组依据:必须使用
TRUNC(date_sys, 'IW')而非格式化后的字符串分组,避免因字符串转换导致的分组错误
内容的提问来源于stack exchange,提问作者SunnyDays
相关产品推荐
相关产品推荐

