SELECT t.ddate,decode(knum,NULL,0,knum)
(SELECT TO_CHAR(SDATE + (ROWNUM - 1), 'yyyy-mm-dd') ddate
  FROM (SELECT LAST_DAY(ADD_MONTHS(SYSDATE, -1)) + 1 SDATE,
               LAST_DAY(SYSDATE) EDATE
          FROM DUAL) T
CONNECT BY SDATE + (ROWNUM - 1) <= EDATE
) t 
LEFT JOIN 
(select date, count(distinct order_no) knum from tbl_sales group by date) k ON t.ddate=k.DATE
希望对你有帮助。。
我的思路就是先取正月每天日期,在左关联你统计的数据。。

解决方案 »

  1.   


    SELECT t.ddate,decode(knum,NULL,0,knum)
    (SELECT TO_CHAR(SDATE + (ROWNUM - 1), 'yyyy-mm-dd') ddate
      FROM (SELECT LAST_DAY(ADD_MONTHS(SYSDATE, -1)) + 1 SDATE,
                   LAST_DAY(SYSDATE) EDATE
              FROM DUAL) T
    CONNECT BY SDATE + (ROWNUM - 1) <= EDATE) t LEFT JOIN 
    (select date, count(distinct order_no) knum from tbl_sales group by date) k ON t.ddate=k.DATE
    编辑有问题,重新发一下。。
      

  2.   

    随便举个间隔时间的例子with t as (
    select to_date('2014-02-01','yyyy-mm-dd') tdate,2 order_no from dual
    union all
    select to_date('2014-02-01','yyyy-mm-dd') tdate,3 order_no from dual
    union all
    select to_date('2014-02-02','yyyy-mm-dd') tdate,4 order_no from dual
    union all
    select to_date('2014-02-04','yyyy-mm-dd') tdate,8 order_no from dual
    union all
    select to_date('2014-02-04','yyyy-mm-dd') tdate,10 order_no from dual
    )
    select edate,
           decode((select sum(order_no)
                    from t
                   where tdate = t1.edate
                   group by tdate),
                  null,
                  0,
                  (select sum(order_no)
                     from t
                    where tdate = t1.edate
                    group by tdate))
      from (select to_date('2014-02-01', 'yyyy-mm-dd') + (rownum - 1) edate
              from dual
            connect by rownum <= to_date('2014-02-28', 'yyyy-mm-dd') -
                       to_date('2014-02-01', 'yyyy-mm-dd') + 1) t1
      

  3.   

    当月  那你可以换一下:
    select edate,
           decode((select sum(order_no)
                    from t
                   where tdate = t1.edate
                   group by tdate),
                  null,
                  0,
                  (select sum(order_no)
                     from t
                    where tdate = t1.edate
                    group by tdate))
      from (select trunc(sysdate,'mm') + rownum - 1  edate
              from dual
            connect by rownum <= trunc(last_day(sysdate)) -
                       trunc(sysdate,'mm') + 1) t1