このタイプのデータ変換は、SQL ServerUNPIVOT
の関数と関数の両方を適用することで実行できます。PIVOT
この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 Fiddle を参照してください
データがUNPIVOT
編集されたら、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 を参照してください
結果は両方のバージョンで同じになります。