急求一条统计一年每个月某个字段总和量的SQL语句,条件有点特殊

急求一条统计一年每个月某个字段总数量的SQL语句,条件有点特殊本帖最后由 waiyzm 于 2012-03-07 09:46:04

急求一条统计一年每个月某个字段总数量的SQL语句,条件有点特殊
本帖最后由 waiyzm 于 2012-03-07 09:46:04 编辑 情况是这样的:

有案件信息表:case_tb 里面有下面几个字段
ajbh           案件编号     
case_date      案发日期    
input_date     录入时间  
foot_num       足迹数量
unit_code      单位代码
                            

有单位表:unit_tb 里面有下面几个字段
unit_code     unit_name
单位代码       单位名称

需求:要实现的统计功能是根据用户选择的年份,比如2011年,把这一年中每个月单位的足迹数量统计出来

条件:麻烦的就是月的统计时间是从上个月20日开始算起到本月21日止(本月的数据),比如统计2011年1月份的,那就是从2010年12月20日到2011年1月21日,2月份的,那就是从1月20日到2月21日

效果如下图:


请问这个统计的SQL语句该怎么写?
[最优解释]


定义一个计算上个月的函数
create or replace function F_Pre_month(pi_yearmonth in varchar2) return varchar2 is
  Result varchar2(6);
  year number;
  month number;
begin
  year:=to_number(pi_yearmonth,1,4);

  month:=to_number(pi_yearmonth,5,2);
  month:=month-1;
  if(month<=0) then
      month:=12;
      year:=year-1;
  end if;
  Result:=year
[其他解释]
lpad(to_char(rownum),2,'0') 月份,
       F_Pre_month(2012
[其他解释]
'20' 起始日期,
       2012
[其他解释]
不知道能不能通过这样的方式来连接?


SELECT add_months(ADD_MONTHS(DATE'2010-12-01',LEVEL)+19,-1) AS COL1
    FROM DUAL
   CONNECT BY LEVEL <= 12

          COL1
--------------------------
12010/12/20
22011/1/20
32011/2/20
42011/3/20
52011/4/20
62011/5/20
72011/6/20
82011/7/20
92011/8/20
102011/9/20
112011/10/20
122011/11/20


[其他解释]
相对而言呗……
在查询计算之间,每个日期减去20,就可以放到一个月里处理了……
[其他解释]
楼上方法直接减20 应该是不合理的

这种逻辑要是相对固定  建议在表里加上额外标记字段
如果不是   
那就内层查询按照逻辑判断创建标记字段
然后外层查询按照创建的标记字段分组统计
[其他解释]
lpad(to_char(month),2,'0');
  return(Result);
end F_Pre_month;

然后

select 
       2012
[其他解释]
lpad(to_char(rownum),2,'0'))
[其他解释]
lpad(to_char(rownum),2,'0')