---------------月份跨年度查询数据------------【100分求助】

kbyst 2009-08-26 11:14:52
需要查询的字段

----------
号码
名称
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 IF

2跨年时:

IF 月FROM <= 某月予算的月 THEN
...

IF 月TO >= 某月予算的月 THEN
...

取值同上




大家有什么好的办法

求教各位,项目紧急,帮忙看看如何解决,

最好能给出SQL,谢谢各位

...全文
236 25 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
kbyst 2009-08-27
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 wildwave 的回复:]
有啊,我能看见
[/Quote]

谢谢你了,有不明白的还会麻烦你的,结贴了
kbyst 2009-08-27
  • 打赏
  • 举报
回复


这回有了?
kbyst 2009-08-27
  • 打赏
  • 举报
回复
小灰狼W 2009-08-27
  • 打赏
  • 举报
回复
有啊,我能看见
kbyst 2009-08-27
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 kbyst 的回复:]
实际上显示效果应该是这样的

是我描述的能力太差

没说明白

不过还是谢谢各位
[/Quote]


晕 我的图呢??

明明已经传上去了 都看见了 怎么没有了
呦呦 2009-08-27
  • 打赏
  • 举报
回复
12楼的SQL太牛了,楼主快结帖吧,嘿嘿
小灰狼W 2009-08-27
  • 打赏
  • 举报
回复
要实现你的功能,如果忽略字段的摆放顺序的话
就是一个简单的行列转换问题
kbyst 2009-08-27
  • 打赏
  • 举报
回复


实际上显示效果应该是这样的

是我描述的能力太差

没说明白

不过还是谢谢各位
小灰狼W 2009-08-27
  • 打赏
  • 举报
回复
楼上的是说,你是要把列变成行来显示
我的理解中你主要的意思是输出的值,解决跨年不跨年的问题
小灰狼W 2009-08-27
  • 打赏
  • 举报
回复
功夫主要是下在那个查询语句里
有几点
1.如果月份不在要查的范围内,显示0
这个简单,通过case搞定

2.因为月份可能跨年,又要按顺序显示
所以我将表行数扩大了一倍。加上条件使得输出行数为12行,并包含要查询的所有月份

3.在扩大后的表中加入rn字段,对记录进行排序赋值。原表1-12月赋值1-12,延长的部分12-24
将传入参数里的月份和rn进行比较,转换成查询条件,来决定要输出哪12行。

再具体,很难说清楚了..你运行下试试
传入参数要符合'YYYY年MM月'的格式
kbyst 2009-08-27
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 mantisxf 的回复:]
纵表变横表。。
[/Quote]

不懂,高手解释下
kbyst 2009-08-27
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 wildwave 的回复:]
SQL codecreateorreplaceprocedure pro_test6(fmonthinvarchar2,lmonthinvarchar2)as
fnumnumber:=2;
lnumnumber:=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);endif;for cur1in (select 名称,rn,casewhen rn<=lnumand rn>=fnumthen valueelse0end valuefrom (select t.*,row_number()over(orderby to_number(substr(名称,1,instr(名称,'月',1,1)-1)))rnfrommoney tunionallselect t1.*,12+row_number()over(orderby to_number(substr(名称,1,instr(名称,'月',1)-1)))frommoney t1)where rn<=casewhen lnum>12then lnumelse12endand rn>casewhen lnum>12then lnumelse12end-12orderby rn)
loop
dbms_output.put_line(casesign(cur1.rn-12)when1then substr(fmonth,1,4)+1else substr(fmonth,1,4)end||'年'||substr(cur1.名称,1,2)||'--'||cur1.value);end loop;end pro_test6;

SQL codebegin
pro_test6('2008年06月','2009年01月');end;

2008年2月--02008年3月--02008年4月--02008年5月--02008年6月--1502008年7月--1002008年8月--2002008年9月--1502008年10--1302008年11--1352008年12--1202009年1月--170
[/Quote]

好强。
谢谢了袄~~

没太看懂,麻烦您解释一下被

各位高人,还有其他的思路没

jiaruimin11 2009-08-26
  • 打赏
  • 举报
回复
case 月
when 月>=to_date(参数,'YYYY-MM')
【某(如12)月予算】= 字段对应表中的值
when 月 <=to_date(参数,'YYYY-MM')
【某(如12)月予算】= 字段对应表中的值
end
jiaruimin11 2009-08-26
  • 打赏
  • 举报
回复
case 月
when 月>=to_date(参数,'YYYY-MM')
【某(如12)月予算】= 字段对应表中的值
when 月 <=to_date(参数,'YYYY-MM')
end
kbyst 2009-08-26
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 opps_zhou 的回复:]
你是要存储过程,输入两个参数,然后查询数据是吗?
而且你描述太混乱了
[/Quote]

就是存储过程啊
opps_zhou 2009-08-26
  • 打赏
  • 举报
回复
你是要存储过程,输入两个参数,然后查询数据是吗?
而且你描述太混乱了
kbyst 2009-08-26
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wildwave 的回复:]

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

您没有看清意思,没有date,是需要把【9月予算】截串,截成9,每一列都和参数时间比较
符合条件取值,不符合赋成0
kbyst 2009-08-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 hebo2005 的回复:]
case
when
end
语句

[/Quote]

这位高手,具体一些好吗,谢谢啦
小灰狼W 2009-08-26
  • 打赏
  • 举报
回复

直接查询不就好了吗
where date>=to_date(参数1,'YYYY-MM') and date<=to_date(参数2,'YYYY-MM')
hebo2005 2009-08-26
  • 打赏
  • 举报
回复
case
when
end
语句
加载更多回复(5)

17,140

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧