如何在Oracle SQL中按周对列计数进行分组?

mspsb9vt  于 2022-12-22  发布在  Oracle
关注(0)|答案(2)|浏览(171)

我有下面的代码,按月份分组数据.

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');

现在我想按周分组如下:

+------------+-------+
|week        | Count |
+------------+-------+
| 2016-12-05 |    14 |
| 2016-12-12 |    20 |
| 2016-12-19 |    19 |
| 2016-12-26 |    15 |
| 2017-01-02 |    13 |
| 2017-01-09 |    14 |
| 2017-01-16 |    12 |
| 2017-01-23 |    12 |
| 2017-01-30 |     5 |

date_format和datepart似乎无法与Oracle SQL一起使用,因为我得到了“ORA-00904:“日期格式”:无效标识符”错误。我想知道是否有人可以帮助代码。我也很感激,如果它可以按每日计数排序。谢谢

uubf1zoe

uubf1zoe1#

我建议使用TRUNC而不是TO_CHAR,因为当您的数据跨越一年以上时,它会将几年的数据组合到一个记录中。

select project_name, to_char(TRUNC(date_sys, 'MM'), 'Month') as Month,      
   sum(BATCH.RECORDS_NUMBER) as Count_of_Documents
from BATCH
group by project_name, TRUNC(date_sys, 'MM');

假设您要根据ISO-8601标准使用按周分组

select project_name, to_char(TRUNC(date_sys, 'IW'), 'YYYY-"W"IW') as WEEK,      
   sum(BATCH.RECORDS_NUMBER) as Count_of_Documents
from BATCH
group by project_name, TRUNC(date_sys, 'IW');

如果您喜欢从星期天开始一周的工作,那么您可以使用

select project_name, TO_CHAR(TRUNC(date_sys+1, 'IW')-1, 'MM/DD/YYYY') as week,       
   sum(BATCH.RECORDS_NUMBER) as Count_of_Documents
from BATCH
group by project_name, TRUNC(date_sys+1, 'IW');

您还可以按一周中的起始日期'D'进行分组。请注意,TRUNC(date_sys, 'D')的输出取决于当前用户会话NLS_TERRITORY的设置,因此输出可能不一致。
参见ROUND and TRUNC Date Functions

lg40wkob

lg40wkob2#

您可以使用ISO week获取一年中的周数,或者,如果您希望第1周从一年的第一天开始,则使用"www"下面的第二个选项:

WITH
    dates AS
        (   Select 
                To_Date('01.01.2022', 'dd.mm.yyyy') + (LEVEL - 1) + ((LEVEL - 1)*2) "A_DATE"
            From Dual 
            Connect By LEVEL <= 9   )
Select
    A_DATE,
    To_Char(A_DATE, 'IW') "ISO_WEEK_NO",
    To_Char(A_DATE, 'ww') "WW_WEEK_NO"
From dates

结果:
| 日期|ISO周编号|WW_周_编号|
| - ------| - ------| - ------|
| 2022年1月1日|五十二|一|
| 2022年1月4日|一|一|
| 2022年1月7日|一|一|
| 二十二年一月十日|二|二|
| 2022年1月13日|二|二|
| 2022年1月16日|二|03|
| 二十二年一月十九日|03| 03|
| 2022年1月22日|03|四|
| 2022年1月25日|四|四|
做组通过使用上面的周数之一,就像你做的月份。
如果你想星期天这里是如何获得星期天的日期星期前一天:

SELECT NEXT_DAY (SYSDATE - 4, 'SUNDAY') - 7 "SUNDAY_WEEK_BEFORE" FROM dual
--  
--  SUNDAY_WEEK_BEFORE
--  ------------------
--  11-DEC-22

相关问题