如何从 case when 中删除 NULL 然后输出 Oracle SQL Developer
Posted
技术标签:
【中文标题】如何从 case when 中删除 NULL 然后输出 Oracle SQL Developer【英文标题】:How to remove NULL from case when and then output Oracle SQL Developer 【发布时间】:2021-07-18 19:18:24 【问题描述】:Oracle SQL Developer 新手在这里。我正在尝试根据仓库名称创建季度销售分析,并将季度销售额输出为 Q1、Q2 等。使用向下钻取查询概念。
我不确定我所做的是否与向下钻取概念有任何关系,但这是我的众多尝试之一。我希望有一种方法可以删除空值输出以保留适当的数据。
希望随着空数据的去除,所有与特定仓库名称相关的输出也将全部输出到1行。给我留下 Warehouse_Name(1)、Q1 数据、Q2 数据等
我目前正在为这个查询使用两个表,它们是 仓库:Warehouse_id、warehouse_name 和 quantity_sold Time_Period:Date_id、Full_date、Days、Month_short 和 year。
我的代码如下:
SELECT TO_CHAR(Full_date, 'Q') AS MY_QTR,
Sum(Quantity_sold) AS HOW_MANY_SOLD_PER_QTR
FROM warehouse, Time_Period
GROUP BY TO_CHAR(Full_date, 'Q')
ORDER BY 1;
Select warehouse_Name,
case
when TO_CHAR(Full_date, 'Q') = 1
then Sum(Quantity_sold)
End as Q1_2019,
case
when TO_CHAR(Full_date, 'Q') = 2
then Sum(Quantity_sold)
End as Q2_2019,
case
when TO_CHAR(Full_date, 'Q') = 3
then Sum(Quantity_sold)
End as Q3_2019,
case
when TO_CHAR(Full_date, 'Q') = 4
then Sum(Quantity_sold)
End as Q4_2019
FROM warehouse w1, Time_Period t1
where Q1_2019 IS NOT NULL
GROUP BY warehouse_Name,TO_CHAR(Full_date, 'Q')
ORDER BY 1;
这为我提供了输出
Waarehouse_Name Q1 Q2 Q3 Q4
--------------- ---- ---- ---- ----
Henderson 990 Null Null Null
Henderson Null 1001 Null Null
Henderson Null Null 1012 Null
Henderson Null Null Null 1012
【问题讨论】:
在 CASE 表达式中使用 ELSE 子句 【参考方案1】:编辑:
正如@mathguy 所提到的
“他使用条件 SUM(按季度条件),并且还在 GROUP BY 子句中按季度分组。如果您从 GROUP BY 中删除该季度(您最终这样做了),则输出中将不再有 null。答案的要点与将 else 0 添加到 case 表达式有关。 “
所以这里不需要使用 else 从 GROUP BY 中删除季度就可以了。
Select warehouse_Name, SUM( case when TO_CHAR(Full_date, 'Q') = 1 then Quantity_sold else 0 End) as Q1_2019,
SUM( case when TO_CHAR(Full_date, 'Q') = 2 then Quantity_sold else 0 End) as Q2_2019,
SUM( case when TO_CHAR(Full_date, 'Q') = 3 then Quantity_sold else 0 End) as Q3_2019,
SUM( case when TO_CHAR(Full_date, 'Q') = 4 then Quantity_sold else 0 End) as Q4_2019
FROM warehouse w1
where Full_date IS NOT NULL
GROUP BY warehouse_Name
ORDER BY 1;
【讨论】:
当你的意思是“如果你只想要一行,那么对每一列使用像 min 或 max 这样的聚合函数。”如何编码?我必须把它写成 SUM(MAX(Quantity_Sold)) 吗?还是其他方式? 更新答案。 伟大的苏格兰人,你是一个绝对的英雄。谢谢你的帮助队友。我一直在为此挠头。现在,根据您的回答,我有一些阅读要做。这样我才能完全理解你所做的一切。再次感谢您。 如果你接受了这个答案不会有什么坏处,那么,@DalCipher,让人们知道这个问题已经解决了。 你更新了答案,没关系。但是答案中的第一句话仍然说“您可以使用else
子句”,而实际上主要的变化是从group by
子句中删除了四分之一。您可能也想澄清这一点。以上是关于如何从 case when 中删除 NULL 然后输出 Oracle SQL Developer的主要内容,如果未能解决你的问题,请参考以下文章