有一个表有两个字段, dt(日期) 和 value(整型), 假设有如下资料
dt                  value
-------------------------
2005-01-01            10
2005-01-10            20
2005-01-23            15
2005-01-26            23
------------------------
如上, 现在我给出一个日期区间, 比如 dt between to_date('2005-01-01') and between to_date('2005-01-30'), 也就是一个月的时间, 要求列出区间内每一天的 value, 如果该天没有数据, 则为0, 这条SQL 怎么写要求的结果
dt                  value
-------------------------
2005-01-01            10
2005-01-02             0
2005-01-03             0
..........等
2005-01-10            20
2005-01-11             0
..........
2005-01-23            15
2005-01-26            23
2005-01-27             0
2005-01-28             0
------------------------

解决方案 »

  1.   

    select dateList.dt, nvl(t1.value,0) from
    (
    select dt from (
    select to_date('2005-01-01', 'yyyy-mm-dd')+rownum-1 dt from dual
    connect by rownum<=to_date('2005-01-30', 'yyyy-mm-dd')-to_date('2005-01-01', 'yyyy-mm-dd') + 1)
    ) dateList,t1 
    where dateList.dt = t1.dt(+)
      

  2.   

    SQL> create table TESTTAB
      2  (
      3    DAT   DATE,
      4    VALUE VARCHAR2(10)
      5  )
      6  /Table createdSQL> insert into testtab values(to_date('2005-01-01','yyyy-mm-dd'),'aa');1 row insertedSQL> commit;Commit completeSQL> insert into testtab values(to_date('2005-01-10','yyyy-mm-dd'),'bb');1 row insertedSQL> commit;Commit completeSQL> insert into testtab values(to_date('2005-01-05','yyyy-mm-dd'),'cc');1 row insertedSQL> commit;Commit completeSQL> select * from testtab;DAT         VALUE
    ----------- ----------
    2005-1-1    aa
    2005-1-10   bb
    2005-1-5    ccSQL> SELECT B.日期, A.VALUE
      2    FROM (SELECT TO_CHAR(DAT, 'yyyy-mm-dd') DAT, VALUE FROM TESTTAB) A,
      3         (
      4          SELECT TO_CHAR(TO_DATE('2005-01-01', 'yyyy-mm-dd') + (ROWNUM - 1),
      5                          'yyyy-mm-dd') 日期
      6            FROM ALL_OBJECTS
      7           WHERE ROWNUM < 367
      8             AND TO_DATE('2005-01-01', 'yyyy-mm-dd') + (ROWNUM - 1) <=
      9                 TO_DATE('2005-01-28', 'yyyy-mm-dd')
    SQL>        ) B
      2   WHERE A.DAT(+) = B.日期
      3  /) B
     WHERE A.DAT(+) = B.日期ORA-00900: 无效 SQL 语句SQL> 
    SQL> SELECT B.日期, nvl(A.VALUE,0)
      2    FROM (SELECT TO_CHAR(DAT, 'yyyy-mm-dd') DAT, VALUE FROM TESTTAB) A,
      3         (SELECT TO_CHAR(TO_DATE('2005-01-01', 'yyyy-mm-dd') + (ROWNUM - 1),
      4                          'yyyy-mm-dd') 日期
      5            FROM ALL_OBJECTS
      6           WHERE ROWNUM < 367
      7             AND TO_DATE('2005-01-01', 'yyyy-mm-dd') + (ROWNUM - 1) <=
      8                 TO_DATE('2005-01-28', 'yyyy-mm-dd')) B
      9   WHERE A.DAT(+) = B.日期
     10  /日期       NVL(A.VALUE,0)
    ---------- --------------
    2005-01-01 aa
    2005-01-02 0
    2005-01-03 0
    2005-01-04 0
    2005-01-05 cc
    2005-01-06 0
    2005-01-07 0
    2005-01-08 0
    2005-01-09 0
    2005-01-10 bb
    2005-01-11 0
    2005-01-12 0
    2005-01-13 0
    2005-01-14 0
    2005-01-15 0
    2005-01-16 0
    2005-01-17 0
    2005-01-18 0
    2005-01-19 0
    2005-01-20 0日期       NVL(A.VALUE,0)
    ---------- --------------
    2005-01-21 0
    2005-01-22 0
    2005-01-23 0
    2005-01-24 0
    2005-01-25 0
    2005-01-26 0
    2005-01-27 0
    2005-01-28 028 rows selectedSQL>
      

  3.   

    参考:http://blog.csdn.net/zhpsam109/archive/2004/09/07/97376.aspx