2016-04-14 2 views
-1

У меня есть запрос, который дает значение Sales за последние три месяца. Я хочу получить все данные за три месяца в одном запросе вместо трех разных запросов. Если я дам «Мар-2016», он должен отобразить мне данные за последние три месяца с февраля по 2016 год, с января по 2016 год и с декабря 2015 года.Как получить данные за последние три месяца в одном запросе

Пожалуйста, помогите мне с этим.

SELECT 
    TO_CHAR(A.JOB_DATE , 'MON-YYYY') S_MON , NULL T_MON, 
    TO_CHAR(A.JOB_DATE,'MM-YYYY') MM, C.SECTION_CODE SECTION, 
    B.ITEM_CODE ITEM_CODE, SUM(B.MASTER_QUANTITY) SALES, 
    NULL TARGET 
FROM 
    TRANSACTION_MASTER A, TRANSACTION_DETAIL B, 
    ITEM_SECTION C, ITEM D 
WHERE 
    A.TRANSACTION_NUMBER = B.TRANSACTION_NUMBER 
    AND TO_CHAR(ADD_MONTHS(A.JOB_DATE,1), 'MON-YYYY') = 'MAR-2016' 
    AND A.TRANSACTION_CODE = B.TRANSACTION_CODE 
    AND B.ITEM_CODE = D.ITEM_CODE 
    AND C.SECTION_CODE = D.SECTION_CODE 
    AND A.TRANSACTION_CODE IN (2,4) 
    AND D.ITEM_STATUS = 'A' 
    AND C.SECTION_CODE BETWEEN :ST_CODE AND :END_CODE 
GROUP BY 
    TO_CHAR(A.JOB_DATE, 'MON-YYYY'), TO_CHAR(A.JOB_DATE, 'MM-YYYY'), 
    C.SECTION_CODE, B.ITEM_CODE 

UNION 

SELECT 
    TO_CHAR(A.JOB_DATE, 'MON-YYYY') S_MON, NULL T_MON, 
    TO_CHAR(A.JOB_DATE, 'MM-YYYY') MM, 
    C.SECTION_CODE SECTION, B.ITEM_CODE ITEM_CODE, 
    SUM(B.MASTER_QUANTITY) SALES, NULL TARGET 
FROM 
    TRANSACTION_MASTER A, TRANSACTION_DETAIL B, 
    ITEM_SECTION C, ITEM D 
WHERE 
    A.TRANSACTION_NUMBER = B.TRANSACTION_NUMBER 
    AND TO_CHAR(ADD_MONTHS(A.JOB_DATE, 2), 'MON-YYYY')= 'MAR-2016' 
    AND A.TRANSACTION_CODE = B.TRANSACTION_CODE 
    AND B.ITEM_CODE = D.ITEM_CODE 
    AND C.SECTION_CODE = D.SECTION_CODE 
    AND A.TRANSACTION_CODE IN (2,4) 
    AND D.ITEM_STATUS = 'A' 
    AND C.SECTION_CODE BETWEEN :ST_CODE AND :END_CODE 


    GROUP BY TO_CHAR(A.JOB_DATE , 'MON-YYYY') , TO_CHAR(A.JOB_DATE,'MM-YYYY') ,C.SECTION_CODE , B.ITEM_CODE 


    UNION 

    SELECT TO_CHAR(A.JOB_DATE , 'MON-YYYY') S_MON , NULL T_MON , TO_CHAR(A.JOB_DATE,'MM-YYYY') MM , 
    C.SECTION_CODE SECTION , B.ITEM_CODE ITEM_CODE , SUM(B.MASTER_QUANTITY) SALES , NULL TARGET 

    FROM TRANSACTION_MASTER A , TRANSACTION_DETAIL B , ITEM_SECTION C , ITEM D 

    WHERE A.TRANSACTION_NUMBER = B.TRANSACTION_NUMBER 
    AND TO_CHAR(ADD_MONTHS(A.JOB_DATE,3),'MON-YYYY') = 'MAR-2016' 
    AND A.TRANSACTION_CODE = B.TRANSACTION_CODE 
    AND B.ITEM_CODE = D.ITEM_CODE 
    AND C.SECTION_CODE = D.SECTION_CODE 
    AND A.TRANSACTION_CODE IN (2,4) 
    AND D.ITEM_STATUS = 'A' 
    AND C.SECTION_CODE BETWEEN :ST_CODE AND :END_CODE 

    GROUP BY TO_CHAR(A.JOB_DATE , 'MON-YYYY') , TO_CHAR(A.JOB_DATE,'MM-YYYY') ,C.SECTION_CODE , B.ITEM_CODE 
+1

[Плохие привычки пинать: использование JOIN в старом стиле] (http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style- joins.aspx) - стиль старого стиля * разделенный запятыми список таблиц * был заменен на * правильный * ANSI 'JOIN' синтаксис в ANSI - ** 92 ** SQL Standard (** более 20 лет **) назад), и его использование обескуражено –

ответ

0

Насколько я могу сказать единственное, которое отличается в союзно-е изд подзапросов является эта строка ИНЕКЕ:

AND TO_CHAR(ADD_MONTHS(A.JOB_DATE,1), 'MON-YYYY') = 'MAR-2016' 
           ^

Фактическая логика вы подаете это (*):

and a.job_date between date '2015-12-01' and date '2016-02-29' 

Это может быть обобщен с параметром для

and a.job_date between :p_start_date and last_day(add_months(:p_start_date,2)) 

Если количество месяцев в диапазоне дат также является переменной, вам нужен другой параметр.

и a.job_date между: p_start_date и LAST_DAY (add_months (: p_start_date,: p_add_months_int))

Значение p_add_months_int на единицу меньше, чем число месяцев в диапазоне: так 2 границы диапазоне трех из месяцы.

Если вы хотите, чтобы определить диапазон в течение последних трех месяцев, передав в дату окончания затем использовать отрицательные числа в add_months() вызова:

and a.job_date between trunc(add_months(:p_end_date,-2)) and last_day(:p_end_date) 

", если я дать«Mar- 2016 ', он должен отображать мне последние данные за 3 месяца с февраля по 2016 год, январь-2016 и декабрь 2015 года ».

Хорошо, для именно то, что вы хотите

and a.job_date between add_months(to_date(:p_start_date, 'MON-YYYY'),-3)) 
       and to_date(:p_start_date, 'MON-YYYY'),-1) 

(*) Если вы ожидали диапазон дат 2016-01-01 до 2016-03-31 Вы возможно, неправильно понял, что делает ADD_MONTHS(A.JOB_DATE,1).

+0

Ну, я решил указать только один параметр, то есть, если я дам «Мар-2016», он должен отобразить мне последние данные за 3 месяца Feb-2016, Jan-2016 и Dec-2015. Это то, чего я хочу. – SHA

+0

Вот что я хотел. Огромное спасибо..!! – SHA