2012-09-19 2 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 

출력은 다음과 같다 (여기서 열고 쿼리 생성되지 개폐하지만 그 쿼리에서이어야 필요) I는 상기와 출력을 생성하는 데 필요한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

귀하의 대문자 잠금 키 걸이입니까? UN-STICK IT, 제발. –

+0

실수로 인해 .. 죄송합니다. – YesYeeYen

답변

0

당신의 CASED.OP_TYPE1 동일하지 않을 때 NULL를 반환합니다 다른하여 CASE없이 ELSE

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

을 필요로하고 아무것도 + 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

Purposely 나는 그 열을 비워 뒀다, 그 열리고 닫는 런타임을 계산하는 방법을 잘 모르겠다. bscs – YesYeeYen

+0

고마워. 이걸 내가 보자 ... – YesYeeYen

1

제품 및 고객의 혼합을 피하기 위해 파티션 조항에 PROD_ID 및 CUSTOMER_ID와 함께 analytics를 사용했습니다.

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

이것은 잘 작동한다 :) Thanks Dude – YesYeeYen

관련 문제