【问题标题】:Group by date intervall Oracle按日期间隔分组 Oracle
【发布时间】:2021-02-25 06:18:33
【问题描述】:

我想从一个表中检索整个月的重量数据总和。 我需要帮助的是我想将结果分为两部分 每月 1-15 的总和 以及当月的第二行 16-31。

SELECT(SUM(B.SCALE_WEIGHT) FROM TRACKING.DATALOG_TAB B WHERE B.MATERIALID= 1 AND B.SCALE_EVENTDATE BETWEEN TO_DATE(TRUNC(TO_DATE('2020-10-1', 'YYYY-MM-DD'),'MONTH')) AND TO_DATE(TRUNC(TO_DATE('2020-10-1', 'YYYY-MM-DD'), 'MONTH')+30)
GROUP BY(somthing like this - 1-15  and 16-31)

【问题讨论】:

    标签: sql oracle datetime aggregate-functions date-arithmetic


    【解决方案1】:

    这是一种选择:

    select
        1 + floor(extract(day from scale_eventdate) / 16) as fortnight,
        sum(b.scale_weight) as sum_scale_weight
    from tracking.datalog_tab b 
    where 
        materialid = 1 
        and scale_eventdate >= date '2020-10-01'
        and scale_eventdate <  date '2020-11-01'
    group by 1 + floor(extract(day from scale_eventdate) / 16)
    

    这会从日期中提取天数,然后使用算法:从该月的 1 日到 15 日的每一天都转到fortnight 编号1,之后的所有内容都转到存储桶2

    我们也可以使用 to_char()case 表达式来做到这一点,这在某种程度上更具表现力:

    select
        case when to_char(scale_eventdate, 'dd') <= '15' then 1 else 2 end as fortnight,
        sum(b.scale_weight) as sum_scale_weight
    from tracking.datalog_tab b 
    where 
        materialid = 1 
        and scale_eventdate >= date '2020-10-01'
        and scale_eventdate <  date '2020-11-01'
    group by case when to_char(scale_eventdate, 'dd') <= '15' then 1 else 2 end
    

    请注意,我将日期过滤逻辑更改为使用标准日期文字,这使得查询更短且更具可读性。

    【讨论】:

    • 那是正确的,但我想选择多列?另一列 fo materialId = 2
    • @B.j:这确实是一个不同的问题。如果是这样,您应该提出一个新问题。这回答了您提出的问题。
    猜你喜欢
    • 2015-03-01
    • 2016-10-06
    • 1970-01-01
    • 2011-03-02
    • 2016-09-21
    • 2019-10-31
    • 1970-01-01
    • 1970-01-01
    • 2016-03-23
    相关资源
    最近更新 更多