2016-07-06 40 views
1

ORACLE SQLのPIVOT関数でNULLを0に置き換えるにはどうすればよいですか?私が望む何ORACLE SQL:Pivot関数でNULLを0に置き換えるにはどうすればいいですか?

SELECT * 
FROM 
(
SELECT DISTINCT 
    CUSTOMER_ID AS CUSTOMER_ID, 
    CASE 
     WHEN CATEGORY_CODE = '01' THEN 'CAT 01' 
     WHEN CATEGORY_CODE = '02' THEN 'CAT 02' 
     WHEN CATEGORY_CODE = '03' THEN 'CAT 03' 
     ELSE 'OTHER' END AS CATEGORY, 
    SUM(ORDERS) AS ORDERS 
FROM 
    TABLE_01 
GROUP BY 
    CUSTOMER_ID, 
    CASE 
     WHEN CATEGORY_CODE = '01' THEN 'CAT_01' 
     WHEN CATEGORY_CODE = '02' THEN 'CAT_02' 
     WHEN CATEGORY_CODE = '03' THEN 'CAT_03' 
     ELSE 'OTHER' END 
) 
PIVOT 
    (
    SUM(ORDERS) 
    FOR CATEGORY IN 
     (
     'CAT_01', 
     'CAT_02', 
     'CAT_03', 
     'OTHER' 
     ) 
    ) 
) 
; 

は、顧客が特定のカテゴリに任意の順序を持​​っていないとき、それは0の代わりにNULLを返すというテーブルを持つことです: これは私が書くしようとしているクエリです。

CUSTOMER_ID CAT_01 CAT_02 CAT_03 
00001    0  100  0 
00002   100  0  0 
00003    0  0  100 

これは、いくつかのカテゴリとネストされたクエリを持つ複雑なクエリの非常に簡単な部分です。

答えて

3

nvlの呼び出しでラップできるように、上部にあるクエリの部分のselect *を個別に変更する必要があります。必要に応じて​​3210を使用することもできます。

select customer_id, 
     nvl(cat_01, 0) as cat_01, 
     nvl(cat_02, 0) as cat_02, 
     nvl(cat_03, 0) as cat_03, 
     nvl(other, 0) as other 
from (... 
+0

SUM関数にCOALESCEを追加することはできますか?このように: ピボット(SUM(COALESCE(ORDERS、0))FOR ... – user3644952

+0

'NVL(...、0)'内の各 'ORDERS'をラップすることはうまくいくでしょう同じこと)。 – mathguy

関連する問題