如何从 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的主要内容,如果未能解决你的问题,请参考以下文章

case when用法sql

Doctrine CASE WHEN THEN ELSE NULL

mysql case when 碰上中文字符串

case when then 中判断null的方法

case when then 中判断null的方法

如何在 django 中向 Case、When 条件添加排序