需要查询的字段----------
号码
名称
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月予算
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,谢谢各位
解决方案 »
- 【求助】oracle在系统重起后无法登陆em【求助】
- oracle小时比较
- 求助, 求一条SQL语句,大侠快来.有点难度!
- 为什么在存储过程里选不出值来?
- Oracle9i在安装时候,选择企业版,并选择不自动安装数据库的安装方式,安装成功后,现在需要创建数据库,如何解决,谢谢!
- 为何我的oracle安装后没有 oem? up也有分
- 我如何看我的监听开启(客户端的)
- oracle startup启动 __streams_pool_size 问题
- 用户下的对象列表没有了,求救。调不出来,看不到有多少表、视图等等
- 求一个SQL语句
- 请教sqlldr导入定长文件的一个问题
- 往数据库插入一条记录,如何知道该记录的插入时间!(没有字段专门记录时间)难道CSDN没人能解答吗?
when
end
语句
直接查询不就好了吗
where date>=to_date(参数1,'YYYY-MM') and date<=to_date(参数2,'YYYY-MM')
您没有看清意思,没有date,是需要把【9月予算】截串,截成9,每一列都和参数时间比较
符合条件取值,不符合赋成0
when 月>=to_date(参数,'YYYY-MM')
【某(如12)月予算】= 字段对应表中的值
when 月 <=to_date(参数,'YYYY-MM')
end
when 月>=to_date(参数,'YYYY-MM')
【某(如12)月予算】= 字段对应表中的值
when 月 <=to_date(参数,'YYYY-MM')
【某(如12)月予算】= 字段对应表中的值
end
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
有几点
1.如果月份不在要查的范围内,显示0
这个简单,通过case搞定2.因为月份可能跨年,又要按顺序显示
所以我将表行数扩大了一倍。加上条件使得输出行数为12行,并包含要查询的所有月份3.在扩大后的表中加入rn字段,对记录进行排序赋值。原表1-12月赋值1-12,延长的部分12-24
将传入参数里的月份和rn进行比较,转换成查询条件,来决定要输出哪12行。再具体,很难说清楚了..你运行下试试
传入参数要符合'YYYY年MM月'的格式