我目前正在尝试这样的查询:
(伪码)
SELECT
NAME, SUM(VALUE), MONTH
FROM TABLE
WHERE MONTH BETWEEN 12 MONTHS AGO AND NOW
GROUP BY MONTH, NAME
我得到的问题是在几个月内存在一个名称,但不是所有月份都存在,所以如果我将其过滤掉以仅返回一个名称的值,我有时只会得到3或4行而不是我期望看到的12。
我的问题是,有没有办法返回行,它仍然包含名称和范围内的月份,当我错过上一个结果中的行时,该值将被设置为零。
我的第一个想法就是将另一个选择合并到它上面,但我似乎无法使逻辑工作以遵守该组,以及限制名称的where子句。
答案 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