一个交叉表
发表于:2007-07-02来源:作者:点击数:
标签:
一个交叉表.用字段明做为值:原表数据为: 字段1 字段2 字段3 A1 B1 C1 A2 B2 C2 变换后: COL1 COL2 COL3 字段1 A1A2 字段2B1B2 字段3C1C2 create table tablename (字段1 varchar(100),字段2 varchar(100),字段3 varchar(100)) insert tablename select @#gsm
一个交叉表.用字段明做为值:原表数据为:
字段1 字段2 字段3
A1 B1 C1
A2 B2 C2
变换后:
COL1 COL2 COL3
字段1 A1 A2
字段2 B1 B2
字段3 C1 C2
create table tablename (字段1 varchar(100),字段2 varchar(100),字段3 varchar(100))
insert tablename select @#gsm900/1800mhz/gprs@#, @#85*44*21mm@#, @#80@#
union all select @#gsm900/1800mhz/gprs@# ,@#82*46*21.5mm@#, @#79@#
go
SELECT top 0
字段名=a.name
into abc
FROM syscolumns a
inner join sysobjects d on a.id=d.id
left join sysproperties f on d.id=f.id and f.smallid=0
where d.xtype=@#U@# and d.name = @#tablename@#
order by a.id,a.colorder
SELECT top 0
note =a.name
into abcd
FROM syscolumns a
inner join sysobjects d on a.id=d.id
left join sysproperties f on d.id=f.id and f.smallid=0
where d.xtype=@#U@# --表示用户类型
and d.name = @#tablename@# -- 需要获取字段的表
order by a.id,a.colorder
declare @num int , @Col varchar(50) , @Name varchar(200), @Name1 varchar(200) , @count int , @num1 varchar(5)
select @num = 1
select @count = count(*) from tablename
while (@count > 0)
begin
select @Col = @#Col@# + convert(varchar, @num)
exec(@#ALTER TABLE abc add [@# + @Col + @#] varchar(200) NULL @#)
select @num = @num +1
set @count = @count - 1
end
DECLARE AddNameColumns_Cursor INSENSITIVE CURSOR --取字段值
FOR
SELECT
filedname = a.name
FROM syscolumns a
inner join sysobjects d on a.id=d.id
left join sysproperties f on d.id=f.id and f.smallid=0
where d.xtype=@#U@# and d.name = @#tablename@#
order by a.id,a.colorder
OPEN AddNameColumns_Cursor
BEGIN
FETCH NEXT FROM AddNameColumns_Cursor INTO @Name --对应相应字段值
WHILE @@FETCH_STATUS = 0
BEGIN
insert into abc (字段名)
select fname = @Name
delete abcd
exec (@# insert into abcd (note) select name = [@# + @Name +@#] from tablename @#)
select @num = 1
DECLARE AddNameColumns_Cursor1 INSENSITIVE CURSOR
FOR select note from abcd
OPEN AddNameColumns_Cursor1
BEGIN
FETCH NEXT FROM AddNameColumns_Cursor1 INTO @Name1
WHILE @@FETCH_STATUS = 0
BEGIN
select @num1 = convert(varchar, @num)
exec(@#update abc set [Col@#+ @num1 + @#] = @#@#@# + @Name1+@#@#@# where 字段名=@#@#@#+ @Name +@#@#@#@#)
print @#update abc set [@# + @Col + @#] = @#@#@# + @Name1+@#@#@# where 字段名=@#@#@#+ @Name +@#@#@#@#
select @num = @num +1
FETCH NEXT FROM AddNameColumns_Cursor1 INTO @Name1
END
END
CLOSE AddNameColumns_Cursor1
DEALLOCATE AddNameColumns_Cursor1
FETCH NEXT FROM AddNameColumns_Cursor INTO @Name
END
END
CLOSE AddNameColumns_Cursor
DEALLOCATE AddNameColumns_Cursor
select * from abc
SELECT * FROM tablename
drop table tablename
drop table abc
drop table abcd
原文转自:http://www.ltesting.net