使用dual 虛表,構造連續資料

self_control發表於2015-09-24
模擬一個資料表如下
有三個欄位:年、月、數值。但資料不是連續的。如2014年05月 到2015年04月 缺少 2014年06、08、11、12 以及2015年01、02

點選(此處)摺疊或開啟

  1. select '2014' year ,'05' month ,100 val from dual union all
  2. select '2014' year ,'07' month ,100 val from dual union all
  3. select '2014' year ,'09' month ,100 val from dual union all
  4. select '2014' year ,'10' month ,100 val from dual union all
  5. select '2015' year ,'03' month ,100 val from dual union all
  6. select '2015' year ,'04' month ,100 val from dual
如果要求結果中不能有月份缺少怎麼辦? 起始年月與終止年月為引數。
下面給出一解決方案,主要是使用dual 表及connect by level 進行生成全月份的一個檢視,然後與資料表進行左外連線得到月份連續的結果。

點選(此處)摺疊或開啟

  1. with v_date as (
  2.      select '2014' year ,'05' month ,100 val from dual union all
  3.      select '2014' year ,'07' month ,100 val from dual union all
  4.      select '2014' year ,'09' month ,100 val from dual union all
  5.      select '2014' year ,'10' month ,100 val from dual union all
  6.      select '2015' year ,'03' month ,100 val from dual union all
  7.      select '2015' year ,'04' month ,100 val from dual
  8. ), DATELIST as (
  9.     select to_char(add_months( to_date('201405','yyyymm') ,level-1 ),'yyyy' ) year,
  10.     to_char(add_months( to_date('201504','yyyymm') ,level-1 ),'mm' ) month
  11.     from dual connect by level <= months_between( to_date('201504','yyyymm'),to_date('201405','yyyymm'))+1
  12. )

  13. select t.year,t.month,t1.val from DATELIST t,v_date t1
  14. where t.year = t1.year(+) and t.month = t1.month(+)
  15. order by t.year,t.month

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30066956/viewspace-1808318/,如需轉載,請註明出處,否則將追究法律責任。

相關文章