Redshift:如果子查询中不匹配,则字段默认为零

问题描述 投票:0回答:1

当使用 * 而不是命名字段并使用 NVL 或 COALESCE 时没有返回结果时,是否有任何方法可以将子查询聚合函数中的字段值默认为零?

例如这是我所拥有的一个过于简化的版本:

SELECT * 
FROM WIDGETS
LEFT JOIN (
   SELECT widget_id, count(*) as total, 
   SUM(CASE WHEN status='closed' THEN 1 ELSE 0 END) AS open,
   SUM(CASE WHEN status='open' THEN 1 ELSE 0 END) AS closed
   FROM WIDGET_ISSUES
   GROUP BY widget_id
) AS ISSUES
ON WIDGETS.widget_id=ISSUES.widget_id

执行该查询时,有些小部件当前没有任何问题,因此总数应返回零。但是,由于问题表中不存在给定的 widget_id,因此没有结果,并且“open”和“close”的值为空而不是零。

我知道我可以这样做,而不是从主查询中执行 SELECT * : NVL(打开,0) AS 打开,NVL(关闭,0) AS 关闭

但是,我试图不这样做,因为与这个简单的示例不同,真实的示例相当复杂,并且有大量的聚合函数值。我试图防止在更改子查询时需要更改主查询,以使维护更简单。

一个完全可以接受的答案是“这是不可能的,你必须使用NVL”;我只是想确保在我采用该解决方案之前没有任何创造性的解决方案;因为如果只需要更改子查询就可以完成此操作,那么从长远来看,这将使我的生活变得更加轻松。

sql postgresql amazon-redshift
1个回答
0
投票

如果您准备好承担额外加入的费用

SELECT * 
FROM WIDGETS
LEFT JOIN (
   SELECT w.widget_id, count(*) as total, 
   SUM(CASE WHEN status='closed' THEN 1 ELSE 0 END) AS open,
   SUM(CASE WHEN status='open' THEN 1 ELSE 0 END) AS closed
   FROM WIDGETS w
   left join WIDGET_ISSUES wi on w.widget_id=wi.widget_id
   GROUP BY w.widget_id
) AS ISSUES
ON WIDGETS.widget_id=ISSUES.widget_id

演示

© www.soinside.com 2019 - 2024. All rights reserved.