2012-09-19 65 views
0
select year, 
     month , 
     d.PROD_ID, 
     T.CUSTOMER_ID, 
     SUM(CASE WHEN D.OP_TYPE = 1 THEN d.qty END) EARNED, 
     SUM(CASE WHEN D.OP_TYPE = 2 THEN d.qty END) SPEND 
FROM TXN_HEADER T , 
    TXN_DETAIL d , 
    CUSTOMER A, 
    PRODUCT e 
WHERE T.AMOUNT > 0 
AND A.TYPE = 0 
AND T.CUSTOMER_ID = A.CUSTOMER_ID 
AND T.TXN_PK = D.TXN_PK 
and d.PROD_ID = e.PROD_ID 
and e.unit = 0 
group by year, month ,d.PROD_ID, T.CUSTOMER_ID 
ORDER BY 1,2,3,4 

輸出如下(這裏打開和關閉不是由查詢生成,但我要求必須是從查詢)Oracle開始和結束餘額 - 需要SQL還是PL/SQL?

YEAR MONTH PROD CUSTOMER OPENING EARNED SPEND CLOSING 
---- ----- ---- -------- ------- ------ ----- ------- 
2012  8 548 12033  0  8  2  6 
2012  9 509 12033  0  24  0  24 
2012  9 509 12047  0  14  0  14 
2012  9 548 12033  6  1  0  7 
2012  9 548 12047  0  1  0  1 

我需要產生如上述的輸出。在這裏,PROD_ID,CUSTOMER_ID動態地將預先結賬餘額填充爲開頭,並且每月計算期末餘額(開頭+賺取的花費),明智的客戶,明智的產品。是否可以使用SQL編寫或需要使用PL/SQL?

+1

是您的大寫鎖定鑰匙卡?不要吝嗇,請。 –

+0

錯誤,它是..對不起。 – YesYeeYen

回答

0

CASE需要一個ELSE

CASE WHEN D.OP_TYPE = 1 THEN d.qty ELSE 0 END 

沒有其他的CASE將返回NULLD.OP_TYPE不等於1,以及任何+ NULL = NULL。當你的WHEN不滿意時,它會返回NULL,這就是爲什麼你沒有看到這些列的任何內容。

要獲得開閉來計算,你可能需要使用analytic functionsLEADLAG

Select year,month,prod_id,customer_id, 
     LAG(closing,1,0) OVER (order by year,month,prod_id,customer_id) as opening, 
     earned,spend 
     ,(LAG(closing,1,0) OVER (order by year,month,prod_id,customer_id)+closing) as closing 
from (WITH temp AS (select year, 
          month , 
          d.PROD_ID, 
          T.CUSTOMER_ID, 
          0 OPEN, 
          SUM(CASE WHEN D.OP_TYPE = 1 THEN d.qty END) EARNED, 
          SUM(CASE WHEN D.OP_TYPE = 2 THEN d.qty END) SPEND, 
          0 CLOSE 
        FROM TXN_HEADER T , 
          TXN_DETAIL d , 
          CUSTOMER A, 
          PRODUCT e 
        WHERE T.AMOUNT > 0 
         AND A.TYPE = 0 
         AND T.CUSTOMER_ID = A.CUSTOMER_ID 
         AND T.TXN_PK = D.TXN_PK 
         and d.PROD_ID = e.PROD_ID 
         and e.unit = 0 
        group by year, month ,d.PROD_ID, T.CUSTOMER_ID 
        ORDER BY 1,2,3,4) 
    SELECT year,month,prod_id,customer_id,open,earned,spend,(open+earned-spend) as closing 
    from temp); 
+0

意思是我把這些列留空,bcos我不知道如何計算那些打開和關閉運行時間 – YesYeeYen

+0

謝謝..讓我檢查一下... – YesYeeYen

1

我會使用的分析,與PROD_ID和CUSTOMER_ID分區子句中避免混淆產品和客戶。

WITH 
MONTHLY_BALANCE AS 
(
    SELECT 
    YEAR, 
    MONTH, 
    D.PROD_ID, 
    T.CUSTOMER_ID, 
    SUM(CASE WHEN D.OP_TYPE = 1 THEN D.QTY ELSE NULL END) EARNED, 
    SUM(CASE WHEN D.OP_TYPE = 2 THEN D.QTY ELSE NULL END) SPEND, 
    FROM TXN_HEADER T 
    JOIN CUSTOMER A 
    ON T.CUSTOMER_ID = A.CUSTOMER_ID 
    JOIN TXN_DETAIL D 
    ON T.TXN_PK = D.TXN_PK 
    JOIN PRODUCT E 
    ON D.PROD_ID = E.PROD_ID 
    WHERE T.AMOUNT > 0 
    AND A.TYPE = 0 
    AND E.UNIT = 0 
    GROUP BY YEAR, MONTH, D.PROD_ID, T.CUSTOMER_ID 
) 
SELECT 
    YEAR, 
    MONTH, 
    PROD_ID, 
    CUSTOMER_ID, 
    SUM(NVL(EARNED, 0) - NVL(SPEND, 0)) OVER(PARTITION BY PROD_ID, CUSTOMER_ID ORDER BY YEAR, MONTH ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) OPENING, 
    EARNED, 
    SPEND, 
    SUM(NVL(EARNED, 0) - NVL(SPEND, 0)) OVER(PARTITION BY PROD_ID, CUSTOMER_ID ORDER BY YEAR, MONTH ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT_ROW) CLOSING 
FROM MONTHLY_BALANCE 
ORDER BY 1, 2, 3, 4 
+0

這工作正常:)謝謝Dude – YesYeeYen