如何为以下内容编写SQL查询?

时间:2019-06-06 06:52:20

标签: sql sql-server

我有两个表,其中n列从Col1Col30

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

1 个答案:

答案 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;