我有一组看起来像这样的数据:
FirstName LastName Field1 Field2 Field3 ... Field27 --------- -------- ------ ------ ------ ------- Mark Smith A B C D John Baptist X T Y G Tom Dumm R B B U
但是,我希望数据看起来像这样:
FirstName LastName Field Value --------- -------- ----- ----- Mark Smith 1 A Mark Smith 2 B Mark Smith 3 C Mark Smith 4 D John Baptist 1 X John Baptist 2 T John Baptist 3 Y John Baptist 4 G Tom Dumm 1 R Tom Dumm 2 B Tom Dumm 3 B Tom Dumm 4 U
我看了PIVOT函数。它可能会起作用。我不太确定。我无法理解如何使用它。但是,我不确定枢轴是否可以在“字段”列中放置“ 4”。根据我的理解,PIVOT函数将简单地将Field1 … Field27的值转置为“ Value”列。
我还考虑过使用游标遍历表,然后遍历字段列,然后将“字段”和“值”插入另一个表。但是,我知道这会影响性能,因为它是基于串行的操作。
任何帮助将不胜感激!如您所知,我对T-SQL(或通常的SQL)和SQL Server还是很陌生。
您可以使用UNPIVOT演奏。有两种方法可以做到这一点:
1)在“静态取消透视”中,您将在查询中对“字段”列进行硬编码。
select firstname , lastname , replace(field, 'field', '') as field , value from test unpivot ( value for field in (field1, field2, field3, field27) ) u
有关有效的演示,请参见SQL Fiddle。
2)或者,您可以使用动态取消透视(Dynamic Unpivot),当您运行SQL时,它将将项目列表获取到PIVOT。如果您要取消设置的字段很多,则“动态”功能非常好。
create table mytest ( firstname varchar(5), lastname varchar(10), field1 varchar(1), field2 varchar(1), field3 varchar(1), field27 varchar(1) ) insert into mytest values('Mark', 'Smith', 'A', 'B', 'C', 'D') insert into mytest values('John', 'Baptist', 'X', 'T', 'Y', 'G') insert into mytest values('Tom', 'Dumm', 'R', 'B', 'B', 'U') DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX); select @cols = stuff((select ','+quotename(C.name) from sys.columns as C where C.object_id = object_id('mytest') and C.name like 'Field%' for xml path('')), 1, 1, '') set @query = 'SELECT firstname, lastname, replace(field, ''field'', '''') as field, value from mytest unpivot ( value for field in (' + @cols + ') ) p ' execute(@query) drop table mytest
两者都会产生相同的结果。