请问如何生成这样的视图(100分)

  • 主题发起人 主题发起人 albertchen
  • 开始时间 开始时间
A

albertchen

Unregistered / Unconfirmed
GUEST, unregistred user!
物理表:
table1:
productid(产品代码) startdate(开始日期) enddate(结束日期) qty(数量/天)
001 2002-3-1 2002-3-5 10
002 2002-3-1 2002-3-9 20
请问要怎样才能生成这样的视图:
productid(产品代码) date(日期) qty(数量/天)
001 2002-3-1 10
001 2002-3-2 10
001 2002-3-4 10
001 2002-3-5 10
002 2002-3-1 20
002 2002-3-2 20
...
就是把开始日期和结束日期拆分开
 
条件不足吧!
 
就是把开始日期和结束日期拆分开,楼上的说说看什么条件不足了?
 
好像没有办法,如果要直接用view表示。
我以前做过一个好象是下面的表格式
生成上面视图格式的。
没有可逆性
 
select productid,date=startdate,qty from productid
union
select productid,enddate,qty from productid

 

select productid,date=startdate,qty from productid where startdate<>enddate
union
select productid,enddate,qty from productid





 
zxb200和mo的做法均不对
 
似乎不能用sql命令搞掂哦
我想大概只能用一个临时表,用存储过程填满他吧
 
interbase的话,用selectable procedure也行
 
如果是SQL SERVER的话,写函数吧.要不然这题无解.
 
还是觉得应该使用Union:

(SELECT proId, DateStart AS date, qty
FROM table1)
UNION
(SELECT proId, DateEnd, qty
FROM table1)
ORDER BY proId
 
to ourself
部队啊!
只有起始和宗止时间,无中间时间
 
能解决,但不实用。
例如:设最大跨越天数为5天。
可以有
select * from (
select product,decode(sign(enddate-statedate),-1 null,statedate) date,other
union
select product,decode(sign(enddate-statedate-1),-1 null,statedate+1) date,other
union
select product,decode(sign(enddate-statedate-2),-1 null,statedate+2) date,other
union
select product,decode(sign(enddate-statedate-3),-1 null,statedate+3) date,other
union
select product,decode(sign(enddate-statedate-4),-1 null,statedate+4) date,other
)
where date is not null order by product,statedate

当然,最大天数可以任意起。但是好像不很实用。
 
我用的是oracle8 日期可以直接操作。
 
谢谢gophie,但这样确实不实用,况且我是用ms sql server的
 
以下代碼在Sql server中調試成功,通過用游標及臨時表完成,有空不妨試試。
if exists(select name from tempdb..sysobjects where name like '%#temp1%')
drop table #temp1
declare @str varchar(10)
declare @begindate datetime
declare @enddate datetime
declare @qty integer
select productid,date=startdate,qty into #temp1 from table1 where 1>2
declare #cursor1 cursor for select productid,startdate,enddate,qty from table1 order by productid
open #cursor1
fetch next from #cursor1 into @str,@begindate,@enddate,@qty
while @@fetch_status=0
begin
while @enddate>=@begindate
begin
insert into #temp1 (productid,date,qty) values (@str,@begindate,@qty)
select @begindate=@begindate+1
end
fetch next from #cursor1 into @str,@begindate,@enddate,@qty
end
close #cursor1
deallocate #cursor1
select * from #temp1 order by productid,date
 
后退
顶部