Этот тип преобразования данных можно выполнить, применив обе функции UNPIVOT
, а затем PIVOT
в SQL Server.
Функция UNPIVOT
берет ваши столбцы Alias
, ShortName
, LongName
и IssuerID
и преобразует их в значения строк. Однако для того, чтобы UNPIVOT
работал, типы данных для этих значений должны быть одинаковыми:
select typename, value, fields
from
(
select cast(alias as varchar(20)) alias,
shortname,
longname,
cast(issuerid as varchar(20)) issuerid,
typename
from Table1
) u
unpivot
(
value
for fields in (Alias, ShortName, LongName, IssuerId)
) unpiv
См. скрипт SQL с демонстрацией.
После того, как данные были UNPIVOT
ed, вы можете применить функцию PIVOT
к значениям столбца Typename
:
select fields, [current], [provisional], [legacy]
from
(
select typename, value, fields
from
(
select cast(alias as varchar(20)) alias,
shortname,
longname,
cast(issuerid as varchar(20)) issuerid,
typename
from Table1
) u
unpivot
(
value
for fields in (Alias, ShortName, LongName, IssuerId)
) unpiv
) src
pivot
(
max(value)
for typename in([current], [provisional], [legacy])
) piv
См. SQL Fiddle с демонстрацией.
Результат запроса:
| FIELDS | CURRENT | PROVISIONAL | LEGACY |
----------------------------------------------------------
| alias | 1 | 2 | 3 |
| issuerid | 23 | 34 | 50 |
| longname | ABC Pvt Ltd. | DEF Pvt Ltd. | GHI Pvt Ltd. |
| shortname | ABC | DEF | GHI |
Если у вас нет доступа к функциям UNPIVOT
и PIVOT
, вы можете использовать запрос UNION ALL
для репликации UNPIVOT
, а затем агрегатную функцию с CASE
для репликации PIVOT
:
select fields,
max(case when typename = 'current' then value end) [current],
max(case when typename = 'provisional' then value end) provisional,
max(case when typename = 'legacy' then value end) legacy
from
(
select typename, cast(alias as varchar(20)) value, 'alias' fields
from Table1
union all
select typename, shortname value, 'shortname' fields
from Table1
union all
select typename, longname value, 'longname' fields
from Table1
union all
select typename, cast(issuerid as varchar(20)) value, 'issuerid' fields
from Table1
) src
group by fields
См. SQL Fiddle с демонстрацией.
Результат будет одинаковым для обеих версий.
person
Taryn
schedule
20.11.2012