2016-04-14 36 views
-1

我有一個查詢可以給出最近三個月的銷售額。我想在一個查詢中獲得所有三個月的數據,而不是三個不同的查詢。如果我給予'2016年3月',它應該顯示我最近三個月的數據2016年2月,2016年1月和2015年12月。如何在單個查詢中獲取最近三個月的數據

請幫我這個。

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 - ** 92 ** SQL標準中**舊式*逗號分隔的表*樣式列表已替換爲* proper * ANSI'JOIN'語法(**超過20年**之前),其使用是不鼓勵 –

回答

0

據我可以告訴這是在工會ED子查詢唯一不同的是該行的WHERE子句:

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年2月,2016年1月和2015年12月。」

好吧,對於恰恰說明,你想要的是

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年1月1日的日期範圍,以2016年3月31日你可能誤解了ADD_MONTHS(A.JOB_DATE,1)的功能。

+0

嗯,我已決定只指定一個參數,即,如果我給'2016年3月'它應該顯示我最後3個月的數據2016年2月,2016年1月和2015年12月。這就是我要的。 – SHA

+0

這就是我想要的。非常感謝..!! – SHA

相關問題