と呼ばれるテーブル変数@t
があります。これは、ここで定義したspecsAndModelタイプのインスタンスです。
CREATE TYPE specsAndModel AS TABLE
(
specName VARCHAR(50)
,specVal VARCHAR(50)
)
を実行するselect specName,specVal from @t
と、次の形式のデータが得られます。
specName | specVal
--------------------------------
[modelNumber] | F00-B4R
[Internal Switch(es)] | 2.00000
[Number of Ports] | 1.00000
[Color Insulator] | Yellow
テーブルを転置するときにmodelNumber
フィールドが表示されるように、最初の行を挿入しました。そのフィールドで転置されたテーブルを別のテーブルに結合するつもりです。
異なるモデルの異なる数のレコードを説明するために、文字列連結を使用してピボットステートメントを作成しました。
DECLARE @cols NVARCHAR(MAX);
DECLARE @query NVARCHAR(MAX);
SELECT @cols = COALESCE(@cols + ',' + specName, specName) FROM @t;
SET @query = N'SELECT ' + @cols
+ N' FROM @var src'
+ N' PIVOT (MAX(specVal) FOR specName in (' + @cols + N')) pvt;';
クエリ文字列は次のようになります。
SELECT [modelNumber],[Internal Switch(es)],[Number of Ports],[Color Insulator]
FROM @var src
PIVOT
(
MAX(specVal)
FOR specName in ([modelNumber],[Internal Switch(es)],[Number of Ports],[Color Insulator])
) pvt;
最後に、変数sp_executesql
を渡してから文字列を実行するために使用します。@t
@query
EXEC sp_executesql @query, N'@var specsAndModel readonly', @t
結果は次のとおりです。
[modelNumber] | [Internal Switch(es)] | [Number of Ports] | [Color Insulator]
-----------------------------------------------------------------------------
NULL | NULL | NULL | NULL
すべてのモデルでnull値を取得し、このピボットのおもちゃの例をsqlfiddleで作成しましたが、期待どおりに機能します。何が間違っているのかわかりません。
null値を取得せずにこのテーブルを転置するにはどうすればよいですか?