1

私は DWH の目的でこのクエリを書いています。

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   

主なものは year,month,week,cpg,dept,cust_id,r_id ,p1,ic,b1,p2,b2 であり、一意の行である必要があります。分析関数を使用して達成可能ですか、それとも書く必要がありますかpl/sql

4

1 に答える 1

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

すべてのデータが 1 つの列にあり、それを 1 つの列にしたい場合は、同様の手法を使用できます。

表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はずですが、 s の方が読みやすいCaseと思いCaseます。

于 2012-10-31T20:00:25.927 に答える