0

と呼ばれるテーブル変数@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値を取得せずにこのテーブルを転置するにはどうすればよいですか?

4

1 に答える 1

5

修正すべき点がいくつかあります。

まず、ステートメントの値の[周囲からを削除します。specNameINSERT

次に、列を取得する方法をこれに変更します。[これにより、specName値が追加されます。

DECLARE @cols NVARCHAR(MAX);
DECLARE @query NVARCHAR(MAX);
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(specName) 
                    from @t
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

これを行うと、スクリプトが機能します。

DECLARE @cols NVARCHAR(MAX);
DECLARE @query NVARCHAR(MAX);
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(specName) 
                    from @t
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

SET @query = N'SELECT ' + @cols 
+ N' FROM @var src' 
+ N' PIVOT (MAX(specVal) FOR specName in (' + @cols + N')) pvt;';

EXEC sp_executesql @query, N'@var specsAndModel readonly', @t

SQL FiddlewithDemoを参照してください

于 2012-08-21T21:46:03.203 に答える