このタイプのデータ変換は、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 を参照してください
結果は両方のバージョンで同じになります。