如何在sql返回中包含缺少的行

时间:2015-04-23 17:23:29

标签: sql oracle

我目前正在尝试这样的查询:

(伪码)

SELECT 
  NAME, SUM(VALUE), MONTH 
FROM TABLE 
WHERE MONTH BETWEEN 12 MONTHS AGO AND NOW 
GROUP BY MONTH, NAME

我得到的问题是在几个月内存在一个名称,但不是所有月份都存在,所以如果我将其过滤掉以仅返回一个名称的值,我有时只会得到3或4行而不是我期望看到的12。

我的问题是,有没有办法返回行,它仍然包含名称和范围内的月份,当我错过上一个结果中的行时,该值将被设置为零。

我的第一个想法就是将另一个选择合并到它上面,但我似乎无法使逻辑工作以遵守该组,以及限制名称的where子句。

3 个答案:

答案 0 :(得分:2)

我有所有月份的数据,您可以采取以下方法。生成所有行(使用cross join),然后引入所需的数据:

select  m.month, n.name, sum(t.value)
from (select distinct month from table) m cross join
     (select distinct name from table) n left join
     table t
     on t.month = m.month and t.name = n.name
group by m.month, n.name;

这会将缺失的总和作为NULL值返回。如果您想要零,请使用coalesce(sum(t.value), 0)

答案 1 :(得分:0)

您可以使用类似下表的内容将过去12个月中的所有内容生成为单独的行:

SELECT add_months(trunc(add_months(sysdate, -12), 'MONTH'), LEVEL - 1)   AS month_in_range
FROM  all_objects
CONNECT BY  LEVEL <= 1 + months_between(add_months(sysdate, -12), TRUNC (sysdate, 'MONTH'));

然后在表和此之间进行外连接。

答案 2 :(得分:0)

我最终实现了类似@paqogomez评论的左外连接。由于我的团队已经在维护时间表,因此很容易获得外部联接的月份列表。

Multiple actions were found that match the request