如何解决如果没有找到行,则为 CASE 语句 |甲骨文
我有一个包含以下数据的示例表。我正在使用 Oracle。
ID Sales STATUS
1 100 XX
1 50 XX
1 40 YY
我必须对具有不同状态的 ID 列上的数据进行分组。我正在使用以下 CASE 查询
SELECT
ID,sum(sales) SALES,CASE
WHEN STATUS='XX' THEN 'POSITIVE'
WHEN STATUS='YY' THEN 'NEGATIVE'
END INDICATOR
from
sample_table
group by
ID,CASE
WHEN STATUS='XX' THEN 'POSITIVE'
WHEN STATUS='YY' THEN 'NEGATIVE'
END;
上面的语句给了我正确的输出
ID SALES INDICATOR
1 150 POSITIVE
1 40 NEGATIVE
现在如果我将数据更改为以下
ID Sales STATUS
1 100 XX
1 50 XX
1 40 XX
上面使用的查询仅给出 POSITIVE 指标行,因为表中没有 YY STATUS。即使同一个 ID 没有状态 YY,我也想显示 0 SALES。
OUTPUT
ID SALES STATUS
1 190 POSITIVE
Desired output
ID SALES STATUS
1 190 POSITIVE
1 0 NEGATIVE
是否有可能获得所需的输出?对于我的数据来说,这是一种罕见的情况,但我仍然想处理它。提前感谢您的帮助。
解决方法
您可以先将 PIVOT
,然后将 UNPIVOT
与 NVL
结合使用,以便您始终为每个 ID 获得一个正面和负面的指示符。
案例 1
WITH
sample_table (ID,Sales,STATUS)
AS
(SELECT 1,100,'XX' FROM DUAL
UNION ALL
SELECT 1,50,40,'YY' FROM DUAL)
SELECT *
FROM (SELECT id,NVL (indicator_pos,0) AS indicator_pos,NVL (indicator_neg,0) AS indicator_neg
FROM (SELECT ID,SALES,CASE
WHEN STATUS = 'XX' THEN 'POSITIVE'
WHEN STATUS = 'YY' THEN 'NEGATIVE'
END INDICATOR
FROM sample_table)
PIVOT (SUM (sales)
FOR INDICATOR
IN ('POSITIVE' AS indicator_pos,'NEGATIVE' AS indicator_neg)))
UNPIVOT (sales FOR INDICATOR IN (indicator_pos AS 'POSITIVE',indicator_neg AS 'NEGATIVE'));
ID INDICATOR SALES
_____ ____________ ________
1 POSITIVE 150
1 NEGATIVE 40
案例 2
WITH
sample_table (ID,'XX' FROM DUAL)
SELECT *
FROM (SELECT id,indicator_neg AS 'NEGATIVE'));
ID INDICATOR SALES
_____ ____________ ________
1 POSITIVE 190
1 NEGATIVE 0
,
您可以添加虚拟数据来处理这种情况-
SELECT ID,SUM(sales) SALES,CASE WHEN STATUS='XX' THEN 'POSITIVE'
WHEN STATUS='YY' THEN 'NEGATIVE'
END INDICATOR
FROM (SELECT ID,sales,STATUS
FROM sample_table
-- ADDING A DUMMY ROW
UNION ALL
SELECT DISTINCT ID,'YY'
FROM sample_table)
GROUP BY ID,CASE WHEN STATUS='XX' THEN 'POSITIVE'
WHEN STATUS='YY' THEN 'NEGATIVE'
END;
,
有很多方法可以解决这个问题。我喜欢首先定义我希望始终出现的列,然后外部连接表以用于聚合查询。
WITH
sample_table (ID,'XX' FROM DUAL
UNION ALL
SELECT 2,'YY' FROM DUAL)
SELECT
ID2,sum(nvl(sales,0)) SALES,CASE
WHEN STATUS2='XX' THEN 'POSITIVE'
WHEN STATUS2='YY' THEN 'NEGATIVE'
END INDICATOR
from
(select distinct t1.id id2,t2.status status2
from sample_table t1 cross join sample_table t2) base_table
left outer join sample_table on id=id2 and status=status2
group by
ID2,CASE
WHEN STATUS2='XX' THEN 'POSITIVE'
WHEN STATUS2='YY' THEN 'NEGATIVE'
END
order by 1;
输出:
ID2 SALES INDICATOR
---------- ---------- ---------
1 0 NEGATIVE
1 190 POSITIVE
2 50 NEGATIVE
2 0 POSITIVE
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。