ORACLE Групповой запрос по неделе, месяцу и году - PullRequest
2 голосов
/ 08 ноября 2011

У меня есть куча запросов, которые берут данные с отметкой времени и выдают 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?

1 Ответ

1 голос
/ 09 ноября 2011

Я думаю, вы ищете что-то вроде этого:

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 может быть вам не нужен, я просто использовал его для логического упорядочивания данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...