ORACLE SQL:如何在 Pivot 函数中将 NULL 替换为 0

Posted

技术标签:

【中文标题】ORACLE SQL:如何在 Pivot 函数中将 NULL 替换为 0【英文标题】:ORACLE SQL: How do I replace NULL with 0 in a Pivot function 【发布时间】:2016-11-09 03:41:27 【问题描述】:

如何在 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

请记住,这是包含多个类别和嵌套查询的复杂查询的一个非常简化的部分。

【问题讨论】:

【参考方案1】:
SELECT CUSTOMER_ID,
NVL(CAT_01,0),
NVL(CAT_02,0)
NVL(   CAT_03   
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'
        )
    )
)
;

【讨论】:

在回答一个老问题时,如果您包含一些上下文来解释您的答案如何提供帮助,那么您的答案将对其他 *** 用户更有用。请参阅:How do I write a good answer。【参考方案2】:

您必须更改顶部查询的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 (... 

【讨论】:

你知道如果我将 COALESCE 添加到 SUM 函数中它会起作用吗?像这样: PIVOT ( SUM(COALESCE(ORDERS,0)) FOR ... 它会起作用,并且将每个ORDERS 包装在NVL( ..., 0) 中也会起作用(它们的意思相同)。 在 PIVOT 的聚合函数中使用 COALESCE 时对我不起作用

以上是关于ORACLE SQL:如何在 Pivot 函数中将 NULL 替换为 0的主要内容,如果未能解决你的问题,请参考以下文章

PIVOT在SQL Sever里面和Oracle里面的用法区别

在oracle SQL中将行移动到列和列到行

Oracle SQL - 如何使用 PIVOT 进行计数

oracle 10G 没有 PIVOT 函数怎么办,自己写一个不久有了

SQL Pivot 函数的问题

如何在 Sql Server 2008 R2 中将列转换为行?