请问大家,这个SQL需求能写出来吗?

[复制链接]
查看11 | 回复9 | 2014-2-18 16:48:49 | 显示全部楼层 |阅读模式
表A数据如下:
建表:
create table A(
lsase_id varchar2(10),
name varchar2(10),
revenue_code varchar2(10),
start_date date,
end_date date,
amount number(10)
)

insert数据:
insert intoRental_Schedule values('T1','abc','rent',2012/03/12,2013/03/11,30000)
insert intoRental_Schedule values('T1','abc','mgt',2012/03/12,2013/03/11,1800)
呈现:
lease_idnamerevenue_code start_date
end_date
amount
T1
abc
rent
2012/03/12
2013/03/11
30000
T1
abc
mgt
2012/03/12
2013/03/11
1800

然后,表B
建表:
create table actual_lease(
lease_idvarchar2(10),
name varchar2910),
month_year varchar2(10),
revenue_code varchar2(10),
start_date date,
end_datedate,
actual number(10))

呈现:
lease_id
name
month_year
revenue_code
start_date
end_date
actual
T1
abc
03/2012
rent
2012/03/12
2012/03/31
19355
T1
abc
03/2012
mgt
2012/03/12
2012/03/31
1161
..
04/2012
..
04/2012
..
..
..
..
T1
abc
03/2013
rent
2013/03/01
2013/03/11
10645
T1
abc
03/2012
mgt
2013/03/01
2013/03/11
639

现在的问题是这样的,B表中的数据是根据insert into B select A这样的命令插入的,
但大家应该可以看到,B表中的month_year是A表中所没有的.因为这里是绑定变量,就是用户输入的.
例如T1中..SQL句子要判断A表中的start/end date, 比如用户输入了03/2012,则insert到表B中的start/end date就应该是2012/03/12和2012/03/31
然后,输入04/2012的话就应该是2012/04/01和2012/04/30,
到最后的时候,用户输入03/2013,则insert到B表中的则是2013/03/01和2013/03/11
我想问下大家,这样的SQL能写出来吗?我想了好半天都没想到什么好方法!求大家指导下!谢谢了.




回复

使用道具 举报

千问 | 2014-2-18 16:48:49 | 显示全部楼层
能,比如instrb结合substrb就能
回复

使用道具 举报

千问 | 2014-2-18 16:48:49 | 显示全部楼层
atgc 发表于 2012-6-18 15:16
能,比如instrb结合substrb就能

但是我现在感觉辨别时间上的问题我不知道如何入手呀...
回复

使用道具 举报

千问 | 2014-2-18 16:48:49 | 显示全部楼层
超越神的杀戮 发表于 2012-6-18 15:17
但是我现在感觉辨别时间上的问题我不知道如何入手呀...

我还以为是一个字符串
又看了一下,你这个不是本身就一个个独立的字段么?直接select不就行了?
回复

使用道具 举报

千问 | 2014-2-18 16:48:49 | 显示全部楼层
超越神的杀戮 发表于 2012-6-18 15:17
但是我现在感觉辨别时间上的问题我不知道如何入手呀...

是不是得用到PL/SQL了呢...感觉要使用if条件语句了啊....
回复

使用道具 举报

千问 | 2014-2-18 16:48:49 | 显示全部楼层
atgc 发表于 2012-6-18 15:20
我还以为是一个字符串
又看了一下,你这个不是本身就一个个独立的字段么?直接select不就行了?

不是的,你看看A表的start和end date,现在给出的是一年的.然后B表是根据用户输入的月份,然后插入数据的..就是说B表的数据是根据A表的数据所得到的..
例如啊,如果用户输入了05/2012,这个月份是在这一年的当中嘛,然后insert到B表的时候就会在B表的start和end date里插入2012/05/01和2012/05/31....懂了吗?

这问题我也是想了老半天才明白的,老板跟我说了大半天鸟语,我愣是虚了..BS老板.
回复

使用道具 举报

千问 | 2014-2-18 16:48:49 | 显示全部楼层
嗯?难道是我穿越了?楼主印象中5月就注册了啊,怎么显示是6月13日也就是前几天才注册的?
没太明白你说的,如果是要将数据展开,那么可以用connect by
回复

使用道具 举报

千问 | 2014-2-18 16:48:49 | 显示全部楼层
本帖最后由 超越神的杀戮 于 2012-6-18 16:18 编辑
lastwinner 发表于 2012-6-18 16:04
嗯?难道是我穿越了?楼主印象中5月就注册了啊,怎么显示是6月13日也就是前几天才注册的?
没太明白你说 ...



其实我穿越了...
基本像是数据展开吧...就是说A表中给出例如:2012/03/12---2013/03/11,这里一共是一年嘛,那么现在是,根据用户输入的month,把这一年分开好几个月,比如输入03/2012(这里表示要在B表中显示3月份的数据),那B表中的日期就 是2012/03/12到2012/03/31...
那么如果输入的04/2012(这里表示要在B表显示4月份的数据)的话.那B表的日期就要输入2012/04/01到2012/04/30了,这样懂了吗...其实这问题确实不好描述,请大家谅解!当初我也是想了好久才明白老板说的意思!
回复

使用道具 举报

千问 | 2014-2-18 16:48:49 | 显示全部楼层
lastwinner 发表于 2012-6-18 16:04
嗯?难道是我穿越了?楼主印象中5月就注册了啊,怎么显示是6月13日也就是前几天才注册的?
没太明白你说 ...

刚看了下connect by的使用方法,应该达不到我需要的要求..郁闷了!
回复

使用道具 举报

千问 | 2014-2-18 16:48:49 | 显示全部楼层
类似这样吧
with a as (
SELECT to_date('2012-03-12', 'yyyy-mm-dd') start_date

,to_date('2013-03-11', 'yyyy-mm-dd') end_date

FROM dual)
SELECT greatest(trunc(to_date('2012-03', 'yyyy-mm'), 'mm'), start_date) new_date1

,least(last_day(to_date('2012-03', 'yyyy-mm')), end_date) new_date2

FROM a
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行