需要查询的字段----------
号码
名称
1月予算
2月予算
3月予算
4月予算
5月予算
6月予算
7月予算
8月予算
9月予算
10月予算
11月予算
12月予算
日期
合计
----------月FROM月TO是传入的参数
检索出来的数据大致形式如下:如输入2008年7月--2009年2月4   5   6   7   8   9   10  11  12  1   2   3
0   0   0  100 200 150 130 135 120 170 160  0下面是我的一点思路,感觉很麻烦1当不跨年时:IF 月FROM <= 某月予算的月(如【10月予算】就是10) AND 月TO >= 某月予算的月 THEN
   【某(如12)月予算】= 字段对应表中的值
ELSE
   【某(如12)月予算】= 0
END IF2跨年时:IF 月FROM <= 某月予算的月 THEN
...IF 月TO >= 某月予算的月 THEN
...取值同上
大家有什么好的办法求教各位,项目紧急,帮忙看看如何解决,最好能给出SQL,谢谢各位

解决方案 »

  1.   

    case 
    when
    end 
    语句
      

  2.   


    直接查询不就好了吗
    where date>=to_date(参数1,'YYYY-MM') and date<=to_date(参数2,'YYYY-MM')
      

  3.   


    您没有看清意思,没有date,是需要把【9月予算】截串,截成9,每一列都和参数时间比较
    符合条件取值,不符合赋成0
      

  4.   

    case 月
    when 月>=to_date(参数,'YYYY-MM')
    【某(如12)月予算】= 字段对应表中的值 
    when 月 <=to_date(参数,'YYYY-MM')
    end
      

  5.   

    case 月 
    when 月>=to_date(参数,'YYYY-MM') 
    【某(如12)月予算】= 字段对应表中的值 
    when 月 <=to_date(参数,'YYYY-MM') 
    【某(如12)月予算】= 字段对应表中的值 
    end
      

  6.   

    create or replace procedure pro_test6(fmonth in varchar2,lmonth in varchar2)
    as
    fnum number:=2;
    lnum number:=5;
    begin 
    fnum:=to_number(substr(fmonth,6,2));
    if to_number(substr(lmonth,1,4))>to_number(substr(fmonth,1,4))
    then lnum:=12+substr(lmonth,6,2);
    else lnum:=substr(lmonth,6,2);
    end if;
      for cur1 in ( select 名称,rn,
                        case when rn<=lnum and rn>=fnum
                       then value
                       else 0 end value
                     from (
                     select t.*,row_number()over(order by to_number(substr(名称,1,instr(名称,'月',1,1)-1)))rn from money t 
                     union all select t1.*,12+row_number()over(order by to_number(substr(名称,1,instr(名称,'月',1)-1))) from money t1)
                     where rn<=case when lnum>12 then lnum else 12 end
                     and rn>case when lnum>12 then lnum else 12 end-12
                     order by rn)
      loop               
        dbms_output.put_line(case sign(cur1.rn-12) when 1 then substr(fmonth,1,4)+1
                              else substr(fmonth,1,4) end||'年'||substr(cur1.名称,1,2)||'--'||cur1.value);
      end loop;
    end pro_test6; 
    begin
    pro_test6('2008年06月','2009年01月');end;2008年2月--0
    2008年3月--0
    2008年4月--0
    2008年5月--0
    2008年6月--150
    2008年7月--100
    2008年8月--200
    2008年9月--150
    2008年10--130
    2008年11--135
    2008年12--120
    2009年1月--170
      

  7.   

    功夫主要是下在那个查询语句里
    有几点
    1.如果月份不在要查的范围内,显示0
    这个简单,通过case搞定2.因为月份可能跨年,又要按顺序显示
      所以我将表行数扩大了一倍。加上条件使得输出行数为12行,并包含要查询的所有月份3.在扩大后的表中加入rn字段,对记录进行排序赋值。原表1-12月赋值1-12,延长的部分12-24
      将传入参数里的月份和rn进行比较,转换成查询条件,来决定要输出哪12行。再具体,很难说清楚了..你运行下试试
    传入参数要符合'YYYY年MM月'的格式
      

  8.   

    12楼的SQL太牛了,楼主快结帖吧,嘿嘿