これは、関数を使用して実現できますPIVOT
。GROUP BY
各行を区別するインジケーターがあるため、これは機能します。データの場合、インジケータはrowNumber
列です。
列の数が決まっている場合は、静的ピボットを使用してそれらをハードコードする必要があります。コードは次のようになります。
select [1], [2], [3]
from
(
select colNumber, RowNumber, CellData
from yourtable
) src
pivot
(
max(CellData)
for colnumber in ([1], [2], [3])
) piv;
SQL Fiddle with Demoを参照してください。
あなたの場合、不明な数の列があると述べました。その場合は、動的 SQL を使用して、ピボットする列のリストを作成する必要があります。コードを動的 SQL に変換しやすくするため、静的バージョンのデモを行いました。
動的 SQL バージョンの鍵は、テーブルにクエリを実行し、列名の文字列を作成することによって行われる列のリストを取得することです。これは次を使用して行われFOR XML PATH
ます。
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(colNumber)
from yourtable
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
このリストは、生成するクエリ文字列に追加され、最終的なコードは次のようになります。
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(colNumber)
from yourtable
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT ' + @cols + '
from
(
select colNumber, rowNumber, CellData
from yourtable
) x
pivot
(
min(CellData)
for colNumber in (' + @cols + ')
) p '
execute(@query)
SQL Fiddle with Demoを参照してください。
両方とも結果が得られます。
| 1 | 2 | 3 |
-----------------------------
| Orange | Apple | Banana |
| Grape | Corn | Lemon |
| Tomato | Lettuce | Onion |