选择过去6个月的记录,包括缺少的月份

时间:2014-02-06 12:20:33

标签: sql database oracle plsql

我使用以下查询:

SELECT TO_CHAR(ADD_MONTHS(SYSDATE, wdl_month_interval), 'Mon YYYY') AS month 
       ,wdl_size_expiring_kb/1024 AS size_expiring_mb 
FROM WIKI_DATA_LIFESPAN 
AND wdl_month_interval < 0 
AND wdl_month_interval >= -6

返回以下内容:

  

2013年9月0.017578125

     

2013年10月0.3076171875

虽然查询的目的是返回所有过去6个月,如果没有记录,则返回0代替wdl_size_expiring_kb变量。我最初想过使用一个循环到-6到-1的变量来显示最近6个月。但我不太清楚最有效的方法是什么。任何人都可以提出任何其他想法,以确定采取什么路线?

非常感谢你的帮助:)

2 个答案:

答案 0 :(得分:0)

Oracle为此提供了数据密集语法,称为“分区外连接”。您选择具有可能缺少元素的数据集(您有查询),并将分区外部连接到所需数据值列表。

11.2文档有一个很好的描述和例子:http://docs.oracle.com/cd/E11882_01/server.112/e25554/analysis.htm#DWHSG02013

答案 1 :(得分:0)

你可以沿着这些线尝试一些东西,首先创建序列0 .. -6,然后创建外部连接:

with seq(i) as (
    select 0 i from dual
    union all
    select i-1
    from seq
    where i>-6
)
select TO_CHAR(ADD_MONTHS(SYSDATE, seq.i), 'Mon YYYY') AS month ,
  ,wdl_size_expiring_kb/1024 AS size_expiring_mb 
from seq
left join WIKI_DATA_LIFESPAN on (wdl_month_interval = seq.i)