Как написать запрос SQL для ниже? - PullRequest
0 голосов
/ 06 июня 2019

У меня есть две таблицы с 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

1 Ответ

0 голосов
/ 06 июня 2019

Это грубый способ сделать это, и если вы не знаете количество столбцов в каждой таблице, вам понадобится использовать динамический 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...