我有一组看起来像这样的数据:
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'列。
我还考虑用Cursor迭代表,然后在字段列上循环,然后在另一个表中插入'Field'和'Value'。但是,我知道这会影响性能,因为它是基于串行的操作。
任何帮助将不胜感激!正如您所知,我对T-SQL(或一般的SQL)和SQL Server都很陌生。
答案 0 :(得分:4)
您可以使用UNPIVOT执行。有两种方法可以做到这一点:
1)在Static Unpivot中,您将在查询中对Field列进行硬编码。
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
两者都会产生相同的结果。
答案 1 :(得分:3)
如果你想查询而不是快速而肮脏的方式将创建联盟
Select FirstName,LastName,1,Field1
from table
UNION ALL
Select FirstName,LastName,2,Field2
from table
.
.
类似于所有字段
答案 2 :(得分:1)
不要使用数据透视,请使用unpivot
,如下所示:
select firstname, lastname, substring(field,6,2) as field, value
from <yourtablename>
unpivot(value for field in (field1,field2,field3,field4,field5,field6,field7,field8,field9,field10,field11,field12,field13,field14,field15,field16,field17,field18,field19,field20,field21,field22,field23,field24,field25,field26,field27,field1,field2,field3,field4,field5,field6,field7,field8,field9,field10,field11,field12,field13,field14,field15,field16,field17,field18,field19,field20,field21,field22,field23,field24,field25,field26,field27)) as unpvt;