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里面的用法区别