日期:2014-05-17  浏览次数:20804 次

动态日期,按日月统计的问题...
table a(qty, type, datetime); 
qty type datetime
3 apple 07/01/12
4 peach 07/15/12
5 watermelon 09/01/12
........

我现在要按日/月统计水果销售情况,sql如下, 现在存在这样一个问题.
例如: 我要查看 1月到5月的统计情况.但是只有3月和4月有数据. 我其实要显示所有月份的数据.没有的设置为0. 同样的问题存在按日统计里.
我在程序里调用下面的sql,只要传入dateformat(mm/yy, dd/mm/yy) 和 startDate&endDate,一个sql就可以搞定. 
我现在想写一个sql解决我上面提到的问题.如何实现,日期是动态的.
例如: 
1. dateformat='mm/yy', startDate='01/01/12', endDate='10/01/12', 统计1月到10月的所有数据.
2. dateformat='dd/mm/yy', startDate='01/01/12', endDate='02/01/12', 统计1月1号到2月1号的所有数据.

-- 按月/日统计
select sum(nvl(qty,0)) cnt, type, to_char(a.createtime, ':dateformat') 
from a where datetime between :startDate and :endDate
group by type, to_char(a.createtime, ':dateformat');


------解决方案--------------------
SQL code

with t1 as
(
     select date'2012-03-01' c1,100 c2 from dual
     union all
     select date'2012-03-14' c1,200 c2 from dual
     union all
     select date'2012-04-03' c1,300 c2 from dual
     union all
     select date'2012-04-22' c1,400 c2 from dual
)

select to_char(a_date,'yyyy-mm') a_date,nvl(sum(c2),0) c2
from 
(
select add_months(date'2012-01-01',level-1) a_date
from dual
connect by level <= 5
) a left join t1 b on to_char(a_date,'yyyy-mm') = to_char(c1,'yyyy-mm')
group by to_char(a_date,'yyyy-mm')
order by a_date

      a_date   c2
---------------------------
1    2012-01    0
2    2012-02    0
3    2012-03    300
4    2012-04    700
5    2012-05    0