我有两个表,其中n列从Col1
到Col30
Table 1
。
Templateid Col1 Col2 Col3 Col4 ...
95 2019-05-28 1234 test123 123456
Table 2
。
Templateid DisplayName ColumnName
95 date col1
95 rank col2
95 purpose col3
95 sign col4
预期结果。
Col1Name Col1Value Col2Name Col2Value Col3Name Col3Value ....
date 2019-05-28 rank 1234 purpose test123
答案 0 :(得分:0)
这是一种粗略的方法,如果您不知道每个表中的列数,则需要使用动态sql来枚举它们,但是出于本示例的目的,我假设您确实知道该数列和要填充的名称。
联合查询允许您使用col1语法预先填充所需的列名称,然后数据透视表使您可以匹配显示名称和显示值。需要使用case语句来确保显示正确的值,并且确实需要为数据透视查询填充派生的列名,但是您确实会以这种方式获得所需的结果。
declare @table1 table (
Templateid int,
Col1 date,
col2 int,
col3 nvarchar(10),
col4 int
);
insert into @table1 (Templateid, col1, col2, col3, col4)
values
(95, '2019-05-28', '1234', 'test123', '123456');
declare @table2 table (
Templateid int,
Displayname nvarchar(10),
ColumnName nvarchar(10)
);
insert into @table2 (Templateid, Displayname, ColumnName)
values
(95, 'date', 'col1'),
(95, 'rank', 'col2'),
(95, 'purpose', 'col3'),
(95, 'sign', 'col4');
select * from
(
select columnname+'Name' as columnname, Displayname
from @table2 t2
union
select columnname+'Value', case when columnname='col1' then cast(col1 as nvarchar(15))
when columnname='col2' then cast(col2 as nvarchar(15))
when columnname='col3' then cast(col3 as nvarchar(15))
when columnname='col4' then cast(col4 as nvarchar(15)) end
from @table1 t1 inner join @table2 t2 on t1.Templateid=t2.Templateid) src
pivot
(max(displayname) for columnname in ([col1Name],[col1Value], [col2Name],[col2Value], [col3Name],[col3Value], [col4Name],[col4Value])) piv;