关于Oracle的问题!300分(300分)

  • 主题发起人 主题发起人 fstao
  • 开始时间 开始时间
F

fstao

Unregistered / Unconfirmed
GUEST, unregistred user!
假如用Oracle8建一表table1,其数据如下:
table1
field0 field1 field2 fields
上年结存 100 100
1999.1 本月合计 100 200
1999.1 本月累计
1999.2 本月合计 230 120
1999.2 本月累计
1999.3 本月合计 210 230
1999.3 本月累计
1999.4 本月合计 400 300
1999.4 本月累计
1999.5 本月合计 200 230
1999.5 本月累计
1999.6 本月合计 300 300
1999.6 本月累计
我想写SQL语句,使数据变为:
table1
field0 field1 field2 fields
上年结存 100 100
1999.1 本月合计 100 200
1999.1 本月累计 200 300
1999.2 本月合计 230 120
1999.2 本月累计 430 420
1999.3 本月合计 210 230
1999.3 本月累计 640 650
1999.4 本月合计 400 300
1999.4 本月累计 1040 950
1999.5 本月合计 200 230
1999.5 本月累计 1240 1180
1999.6 本月合计 300 300
1999.6 本月累计 1540 1480
请问这个SQL语句该如何写?
用Select和Update的方法如何实现?如果是用MSSQL7来实现,同样用Select和
Update的方法又如何实现?
 
建议把表结构改为:
field0 field1 field2 field3 field4 field5 field6

上年结存 100 100
1999.1 本月合计 100 200 本月累计 200 300
1999.2 本月合计 230 120 本月累计 430 420
 
使用Oracle 8的PL/SQL语法可以很方便地解决问题
不过需要使用循环语法
 
use sp:
create procedure test
{}
as
declare c cursor for
select * from table1 order by field0, field1
declare @vf0 char(10)
declare @vf1 char(10)
declare @vf2 int
declare @vf3 int
declare @i int
declare @j int
open c
select @i=0,@j=0
fench c into @vf0,@vf1,@vf2,@vf3
while (@@sqlstatus=0)
begin
if ((@vf0=null) or (@vf0=' '))
begin
select @i=@vf2, @j=@vf3
end
else if (@vf1='本月合计')
begin
select @i=@i+@vf2,@j=@j+@vf3
end
else
begin
update table1 set field2=@i,field3=@j where field0=@vf0 and field1=@vf1
end
fench c into
end
close c
 
Cytomn的太麻烦,其他两个只是建议,不过分数我照给。我自己刚刚解决:
MSSQL7写法:
DECLARE @a int, @b int

SELECT @a=0, @b=0

SELECT field0, field2, fields, 0 AS s1, 0 AS s2
INTO #tmp2
FROM table1
WHERE field1='本月合计'
ORDER BY field0

UPDATE #tmp2
SET @a=@a+field2, @b=@b+fields, s1=@a, s2=@b

UPDATE table1
SET field2=b.s1, fields=b.s2
FROM table1 a, #tmp2 b
WHERE a.field0=b.field0 AND a.field1='本月累计'

DROP TABLE #tmp2

Oracle的写法:
update table1 a
set field2 = (
select sum(b.field2) from table1 b
where b.field0<=a.field0 and b.field1='本月合计'),
field3 = (
select sum(c.field3) from table1 c
where c.field0<=a.field0 and c.field1='本月合计')
where a.field1='本月累计'
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
928
SUNSTONE的Delphi笔记
S
I
回复
0
查看
843
import
I
I
回复
0
查看
680
import
I
后退
顶部