首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

数据倒表有关问题,在线急等~

2012-01-22 
数据倒表问题,在线急等~~~!现有数据表如下:商品编码(主键)商品简称规格产地...1A80上海...2A100上海...3A8

数据倒表问题,在线急等~~~!
现有数据表如下:
      商品编码(主键)         商品简称       规格       产地       ...
              1                               A                 80           上海       ...
              2                               A                 100         上海       ...
              3                               A                 80           北京       ...
              4                               A                 90           北京       ...
              5                               B                 30           广东       ...
              6                               B                 40           广东       ...
              7                               B                 100         上海       ...
              8                               C                 20           湖北       ...
              9                               C                 40           湖南       ...
              10                             C                 50           湖北       ...

原主键:商品编码不能满足实际应用中的需求,所有商品都应分级(共四级),前两级已定,假如本表数据前两级为7   02,后两级每级三位数,从001开始,同一 "商品简称 "的放在第三级,而同一商品不同规格或不同产地地则为第四级,所以应将本表数据导入到另一个新表中,要求数据如下:

      商品编码(主键)         商品简称       规格       产地       ...
            702001                       A                 (null)   (null)
            702001001                 A                 80           上海       ...


            702001002                 A                 100         上海       ...
            702001003                 A                 80           北京       ...
            702001004                 A                 90           北京       ...
            702002                       B                 (null)   (null)
            702002001                 B                 30           广东       ...
            702002002                 B                 40           广东       ...
            702002003                 B                 100         上海       ...
            702003                       C                 (null)   (null)
            702003001                 C                 20           湖北       ...
            702003002                 C                 40           湖南       ...
            702003003                 C                 50           湖北       ...

[解决办法]
if object_id( 'pubs..tb ') is not null
drop table tb
go

create table tb(商品编码 varchar(10),商品简称 varchar(10),规格 varchar(10),产地 varchar(10))
create table tb2(商品编码 varchar(10),商品简称 varchar(10),规格 varchar(10),产地 varchar(10))
insert into tb(商品编码,商品简称,规格,产地) values( '1 ' , 'A ', '80 ' , '上海 ' )
insert into tb(商品编码,商品简称,规格,产地) values( '2 ' , 'A ', '100 ', '上海 ' )
insert into tb(商品编码,商品简称,规格,产地) values( '3 ' , 'A ', '80 ' , '北京 ' )
insert into tb(商品编码,商品简称,规格,产地) values( '4 ' , 'A ', '90 ' , '北京 ' )
insert into tb(商品编码,商品简称,规格,产地) values( '5 ' , 'B ', '30 ' , '广东 ' )
insert into tb(商品编码,商品简称,规格,产地) values( '6 ' , 'B ', '40 ' , '广东 ' )
insert into tb(商品编码,商品简称,规格,产地) values( '7 ' , 'B ', '100 ', '上海 ' )
insert into tb(商品编码,商品简称,规格,产地) values( '8 ' , 'C ', '20 ' , '湖北 ' )


insert into tb(商品编码,商品简称,规格,产地) values( '9 ' , 'C ', '40 ' , '湖南 ' )
insert into tb(商品编码,商品简称,规格,产地) values( '10 ', 'C ', '50 ' , '湖北 ' )
go

declare @jb1 as varchar(10)
set @jb1 = '7 '
declare @jb2 as varchar(10)
set @jb2 = '02 '
declare @jb3 as varchar(10)
declare @jb4 as varchar(10)

select id=identity(int,1,1),* into tb1 from tb
declare @tot as int
select @tot = count(*) from tb1
declare @i as int
set @i = 1
declare @商品简称1 as varchar(10)
declare @商品简称2 as varchar(10)
declare @规格1 as varchar(10)
declare @规格2 as varchar(10)
declare @产地1 as varchar(10)
declare @产地2 as varchar(10)
set @商品简称1 = ' '
set @规格1 = ' '
set @产地1 = ' '

while @i <= @tot
begin
select @商品简称2 = 商品简称 from tb1 where id = @i
if @商品简称2 <> @商品简称1
begin
set @商品简称1 = @商品简称2
select @规格1 = 规格 from tb1 where id = @i
select @产地1 = 产地 from tb1 where id = @i
select @jb3 = right( '000 ' + cast(cast(max(substring(商品编码 , 4 , 3)) as int) + 1 as varchar(3)) , 3) from tb2
if @jb3 is null
begin
set @jb3 = '001 '
end
insert into tb2(商品编码,商品简称,规格,产地) values(@jb1+@jb2+@jb3,@商品简称1,null,null)
insert into tb2(商品编码,商品简称,规格,产地) values(@jb1+@jb2+@jb3+ '001 ',@商品简称1,@规格1,@产地1)
end
else
begin
select @规格2 = 规格 from tb1 where id = @i
select @产地2 = 产地 from tb1 where id = @i
if @规格2 <> @规格1 or @产地2 <> @产地1
begin
set @规格1 = @规格2
set @产地1 = @产地2
select @jb3 = right( '000000 ' + cast(cast(max(substring(商品编码 , 4 , 6)) as int) + 1 as varchar(6)) , 6) from tb2
end
insert into tb2(商品编码,商品简称,规格,产地) values(@jb1+@jb2+@jb3,@商品简称1,@规格1,@产地1)
end
set @i = @i + 1
end
select * from tb2
drop table tb,tb1,tb2

/*
商品编码 商品简称 规格 产地
---------- ---------- ---------- ----------
702001 A NULL NULL
702001001 A 80 上海
702001002 A 100 上海
702001003 A 80 北京
702001004 A 90 北京
702002 B NULL NULL
702002001 B 30 广东
702002002 B 40 广东
702002003 B 100 上海
702003 C NULL NULL
702003001 C 20 湖北
702003002 C 40 湖南
702003003 C 50 湖北

(所影响的行数为 13 行)
*/

热点排行
Bad Request.