简体   繁体   English

按周,月和年查询ORACLE组

[英]ORACLE Group query by week, month and year

I have a bunch of queries that take data with a time stamp and spit out SUMS based the last few weeks, months, and year to date. 我有一堆查询,这些查询带有时间戳,并根据最近几周,几个月和年初的时间吐出SUMS。 It looks like this 看起来像这样

Week1    Sum for most recent week
Week2    Sum for second most recent week
WeekN    Sum for N most recent week
Jan-Dec  Sum for January-December
YTD      Sum for everything this year

This is how the query currently does this 这是查询当前执行此操作的方式

SELECT TIME_PERIOD, INDEX, SUM(ITEM)   
FROM (SELECT
        INDEX ,
        (CASE  
            WHEN ACTIVITY_DAY>=(TO_DATE( :end_day,
            'yyyy-mm-dd' )-6)  
            AND ACTIVITY_DAY<=(TO_DATE( :end_day,
            'yyyy-mm-dd' )-0) THEN 'WEEK1'  
            WHEN ACTIVITY_DAY>=(TO_DATE( :end_day,
            'yyyy-mm-dd' )-13)  
            AND ACTIVITY_DAY<=(TO_DATE( :end_day,
            'yyyy-mm-dd' )-7) THEN 'WEEK2'  
            ELSE NULL  
        END) AS TIME_PERIOD,
        MAX(ITEMS) AS ITEM
    FROM
        SOURCE  
    GROUP BY
        INDEX ,
        DAY  
    UNION
    ALL SELECT
        INDEX ,
        (CASE  
            WHEN ACTIVITY_DAY>=TO_DATE( :year||'-01-01',
            'yyyy-mm-dd' )  
            AND ACTIVITY_DAY<=TO_DATE( :year||'-01-31',
            'yyyy-mm-dd' ) THEN 'Jan'  
            WHEN ACTIVITY_DAY>=TO_DATE( :year||'-02-01',
            'yyyy-mm-dd' )  
            AND ACTIVITY_DAY<TO_DATE( :year||'-03-01',
            'yyyy-mm-dd' ) THEN 'Feb'   
            ELSE NULL  
        END) AS TIME_PERIOD ,
        MAX(ITEMS) AS ITEM
    FROM
        SOURCE  
    GROUP BY
        INDEX ,
        DAY  
    UNION
    ALL SELECT
        INDEX ,
        (CASE  
            WHEN ACTIVITY_DAY>=TO_DATE( :year||'-01-01',
            'yyyy-mm-dd' )  
            AND ACTIVITY_DAY<=TO_DATE( :end_day,
            'yyyy-mm-dd' ) THEN 'YTD'  
            ELSE NULL  
        END) AS TIME_PERIOD,
        MAX(ITEMS) AS ITEM
    FROM
        SOURCE  
    GROUP BY
        INDEX ,
        DAY)
GROUP BY INDEX, TIME_PERIOD  

Is there a better way in Oracle? Oracle中有更好的方法吗?

I think you are looking for something like this: 我认为您正在寻找这样的东西:

with data as
(
    select sysdate - floor(dbms_random.value(1,400)) dt, floor(dbms_random.value(1,100)) val
    from dual
    connect by level <= 100
)
select
    time_period,
    sum(val) period_sum
from
(
    select -- weeks
        'Week'||(to_char(sysdate, 'WW') - to_char(dt, 'WW') + 1) time_period,
        val,
        (to_char(sysdate, 'WW') - to_char(dt, 'WW') + 1) ord
    from data
    where dt >= trunc(sysdate,'YY')
    union all
    select -- months
        to_char(dt, 'Mon') time_period,
        val,
        100+to_char(dt,'MM') ord
    from data
    where dt >= trunc(sysdate,'YY')
    union all
    select -- months
        'YTD' time_period,
        val,
        200
    from data
    where dt >= trunc(sysdate,'YY')
)
group by
    time_period, ord
order by
    ord;

Note that you won't need the WITH block, I was just using it to create some dummy data. 请注意,您不需要WITH块,我只是用它来创建一些伪数据。 The Ord column might be unnecessary for you, I was just using it to order the data in a logical fashion. 您可能不需要Ord列,我只是使用它来以逻辑方式对数据进行排序。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM