3

次の構造を持つ SQL Server でテーブルをピボットする必要があります。

CREATE TABLE table1 (
    ColumnNumber int,
    RowNumber int,
    CellData nvarchar(50)
)

INSERT INTO table1 VALUES
(1, 1, 'Orange'),
(2, 1, 'Apple'),
(3, 1, 'Banana'),
(1, 2, 'Grape'),
(2, 2, 'Corn'),
(3, 2, 'Lemon'),
(1, 3, 'Tomato'),
(2, 3, 'Lettuce'),
(3, 3, 'Onion')

そして、結果のテーブルを次のようにする必要があります。

ここに画像の説明を入力

したがって、行のセルColumnNumberは、結果のテーブルの列名になります。最も難しいのは、異なる列番号の量が可変であることです (したがって、現在は 3 つの列番号がありますが、明日は 6 または 10 になる可能性があります)。

私はPIVOT関数を見てきましたが、すべての例には が含まれてGROUP BYおり、ここでわかるように、「転置」Excel関数のようなものが必要です。

ありがとう !!

4

1 に答える 1

6

これは、関数を使用して実現できますPIVOTGROUP 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 |
于 2013-03-06T23:22:39.820 に答える