sql 每一条记录按步长增加到某一个数,分别写到一个新表 【在线等,速结帐】
如题:
有一个表A
A01[编号] A02[名称] A03[起始长]
--------------------------------------
10001 测试1 500
10002 测试2 600
10003 测试3 800
...
现在想把表A的数据按A03现在的长度每次增加50一直到1000为止放到一个表B里:
欲得到如下表B:
B01[编号] B02[名称] B03[长度]
------------------------------------------------
10001-500 测试1-500 500
10001-550 测试1-550 550
10001-600 测试1-600 600
...
10001-1000 测试1-1000 1000
10002-600 测试2-600 600
...
10002-1000 测试2-1000 1000
10003-800 测试3-800 800
...
10003-1000 测试3-1000 1000
依次类推,一直到长度满1000为止.不就一个存储过程或sql语句。
[解决办法]
这个不难 写个存储过程 添加个while循环 每次取A表一条数据 直至取完,在循环中 设一个变量X赋初始值为该数据的长度,再添加个while循环增加X的值,并插入B表,直至while大于等于1000
[解决办法]
--创建测试数据
Create TABLE #TB (A01 int,A02 varchar(50),A03 varchar(50))
INSERT INTO #TB select '10001', '测试1', '500'
union all select '10002', '测试2', '600'
union all select '10003', '测试3', '800'
--解决方案
select a.A01 as B01,A02 +'-'+cast(A03 + b.number * 50 as varchar(10)) AS B02,cast(A03 + b.number * 50 as varchar(10)) B03
from #TB a,master..spt_values b
where b.type='p' and b.number <= (1000-A03)/50
--
/*
B01 B02 B03
----------- ------------------------- ----------
10001 测试1-500 500
10001 测试1-550 550
10001 测试1-600 600
10001 测试1-650 650
10001 测试1-700 700
10001 测试1-750 750
10001 测试1-800 800
10001 测试1-850 850
10001 测试1-900 900
10001 测试1-950 950
10001 测试1-1000 1000
10002 测试2-600 600
10002 测试2-650 650
10002 测试2-700 700
10002 测试2-750 750
10002 测试2-800 800
10002 测试2-850 850
10002 测试2-900 900
10002 测试2-950 950
10002 测试2-1000 1000
10003 测试3-800 800
10003 测试3-850 850
10003 测试3-900 900
10003 测试3-950 950
10003 测试3-1000 1000
(25 行受影响)
if object_id('testa') is not null drop table testa
go
create table testa(A01 varchar(5),A02 nvarchar(5),a03 int) --创建表
insert into testa --插入数据
select '10001',N'测试1',500
union all
select '10002',N'测试2',600
union all
select '10003',N'测试3',800
--使用游标完成
declare @A01 varchar(10),@A02 nvarchar(10),@a03 int
declare @t table (a varchar(10),b nvarchar(10),c int)
declare cur_hh cursor for select * from testa
open cur_hh
fetch next from cur_hh into @a01,@a02,@a03
while @@fetch_status=0
begin
declare @i int
set @i=1
while(@a03<=1000)
begin
declare @t2 varchar(20),@t1 varchar(20)
set @t2=@a02+'-'+cast(@a03 as varchar(20))
set @t1=@a01+'-'+cast(@a03 as varchar(20))
insert into @t select @t1,@t2,@a03
set @a03=@a03+50
set @i=@i+1
end
fetch next from cur_hh into @a01,@a02,@a03
end
select * from @t
close cur_hh
deallocate cur_hh