2016-07-06 11 views
1

Как заменить NULL на 0 в функции PIVOT на ORACLE SQL? Это запрос, я пытаюсь написать:ORACLE SQL: Как заменить NULL на 0 в функции Pivot

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

Вам нужно будет изменить часть запроса select * вверху, чтобы указать столбцы индивидуально, чтобы вы могли их обернуть в вызовы nvl. Вы также можете использовать coalesce, если хотите.

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

Знаете ли вы, что я должен добавить COALESCE в функцию SUM, это сработает? Вот так: PIVOT (SUM (COALESCE (ORDERS, 0)) FOR ... – user3644952

+0

Это сработало бы, и обертывание каждого 'ORDERS' в' NVL (..., 0) 'будет работать так же хорошо (они означают тоже самое). – mathguy