2012-09-26 20 views
1

我正在爲DWH目的編寫此查詢。oracle分析如何返回此行

SELECT 
    YEAR 
    ,MONTH 
    ,WEEK 
    ,C.CPG_PK   CPG 
    ,C.DEP_PK   DEPT 
    ,T.CUST_ID  CUST_ID 
    ,D1.R_ID   R_ID 
    ,Decode(d2.AT_CODE,'3',FUNC1.GET_ATT(d2.AT_CODE,D2.VAL_CODE)) AS P1 
    ,decode(d2.AT_CODE,'2',FUNC1.GET_ATT(d2.AT_CODE,D2.VAL_CODE)) AS IC 
    ,decode(d2.AT_CODE,'1',FUNC1.GET_ATT(d2.AT_CODE,D2.VAL_CODE)) AS B1 
    ,decode(FUNC1.GET_ATT(d2.AT_CODE,D2.VAL_CODE), 2 , d2.AT_CODE) AS P2 
    ,decode(FUNC1.GET_ATT(d2.AT_CODE,D2.VAL_CODE), 5 , d2.AT_CODE) AS B2 
    ,COUNT(DISTINCT A.CUST_ID)   TOTAL_ACC 
    ,COUNT(DISTINCT T.TXN_PK)   TOTAL_TXN 
    ,SUM(AM_AMOUNT)     TOTAL_AMT 
FROM T_HEADER T 
    ,CUST_MASTER A 
    ,TX_DETAILS1 D1 
    ,TX_DETAILS2 D2 
    ,CPG_MASTER C 
WHERE A.TYPE = 0  
AND  T.CUST_ID = A.CUST_ID 
AND  T.TXN_PK= 5001 
AND  T.TXN_PK= D1.TXN_PK 
AND  T.TXN_PK= D2.TXN_PK 
AND  D1.CPG_PK = C.CPG_PK 
AND  D1.OP = 1 
GROUP BY 
YEAR 
,MONTH 
,WEEK 
,C.CPG_PK 
,C.DEP_PK 
,t.CUST_ID 
,D1.R_ID 
,Decode(d2.AT_CODE,'3',FUNC1.GET_ATT(d2.AT_CODE,D2.VAL_CODE)) 
,decode(d2.AT_CODE,'2',FUNC1.GET_ATT(d2.AT_CODE,D2.VAL_CODE)) 
,decode(d2.AT_CODE,'1',FUNC1.GET_ATT(d2.AT_CODE,D2.VAL_CODE)) 
,decode(FUNC1.GET_ATT(d2.AT_CODE,D2.VAL_CODE), 2 , d2.AT_CODE) 
,decode(FUNC1.GET_ATT(d2.AT_CODE,D2.VAL_CODE), 5 , d2.AT_CODE) 

生成的輸出如下

YEAR MONTH WEEK CPG DEPT CUST_ID R_ID P1 IC B1 P2 B2 TOTAL_ACC TOTAL_TXN TOTAL_AMT 
2012 08 32 127 -1 10019 3665     134 1 1 
2012 08 32 127 -1 10019 3665     135 1 1 
2012 08 32 127 -1 10019 3665   723   1 1 
2012 08 32 127 -1 10019 3665  714    1 1 
2012 08 32 127 -1 10019 3665 21     1 1 
2012 08 32 128 -1 10019 3665     134 1 1 
2012 08 32 128 -1 10019 3665     135 1 1 
2012 08 32 128 -1 10019 3665   723   1 1 
2012 08 32 128 -1 10019 3665  714    1 1 
2012 08 32 128 -1 10019 3665 21     1 1 

這裏的值被重複我試圖與由可能基。

所需的輸出中是

YEAR MONTH WEEK CPG DEPT CUST_ID R_ID P1 IC B1 P2 B2 TOTAL_ACC TOTAL_TXN TOTAL_AMT 
2012 08 32 127 -1 10019 3665 21 714 723  134 1 1 
2012 08 32 127 -1 10019 3665 21 714 723  135 1 1 
2012 08 32 128 -1 10019 3665 21 714 723  134 1 1 
2012 08 32 128 -1 10019 3665 21 714 723  135 1 1 

主要的是年,月,周,CPG,部門,CUST_ID,R_ID,P1,IC,B1,P2,B2應該是唯一的行。是否可以使用分析功能實現,或者我是否需要編寫pl/sql

+0

是我的問題是有意義的嗎? – YesYeeYen

回答

0

看到了這個,我想我有一個答案給你。那麼,你是想爲SQL拿一個表,看起來像:

Year Col_1 Col_2 Col_3 
2012 A 
2012   B 
2012     C 

並將其轉換爲:

Year Col_1 Col_2 Col_3 
2012 A  B  C 

你能做什麼(對於上面的例子)如下:

Select 
    Year, 
    Max(Col_1) as C1, 
    Max(Col_2) as C2, 
    Max(Col_3) as C3 
From 
    Table_1 
Group By 
    Year 

如果您只有1條記錄,這將無法正常工作。否則,您可能必須弄清楚是否需要使用MAX,MIN,SUM或其他聚合函數。

如果所有的數據都在一列,你希望它在一列,你可以使用類似的技術:

TABLE_1

Year Col_1 
2012 A 
2012 B 
2012 C 

代碼

Select 
    Year, 
    Max(Case When Col_1 = 'A' Then 'A' End) as A_Col, 
    Max(Case When Col_1 = 'B' Then 'B' End) as B_Col, 
    Max(Case When Col_1 = 'C' Then 'C' End) as C_Col 
From 
    Table_1 
Group By 
    Year 

注意Decodes應該代替Case聲明,但我認爲Case更容易閱讀。