簡體   English   中英

按周,月和年查詢ORACLE組

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

我有一堆查詢,這些查詢帶有時間戳,並根據最近幾周,幾個月和年初的時間吐出SUMS。 看起來像這樣

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

這是查詢當前執行此操作的方式

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  

Oracle中有更好的方法嗎?

我認為您正在尋找這樣的東西:

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;

請注意,您不需要WITH塊,我只是用它來創建一些偽數據。 您可能不需要Ord列,我只是使用它來以邏輯方式對數據進行排序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM