0

応答が遅く、数日間休み、正確なテーブル構造を指定しなかったことをお詫びします。上記の説明は無視してください。私はより多くの情報を持っているので、以下に説明するように私が本当に必要とするものに関するより多くの情報を取得するので、私の元の質問はもはや有効ではありません:

私は次の表を持っています(議論のために簡略化されたバージョン)。最初の行はヘッダーです。

VariableID  DocumentID  Revision  Value
44          12          2         Val1
45          12          2         Val2
45          12          3         Val3
44          13          1         Val4
46          13          2         Val5
47          14          1         Val6

それを(n行の数を想定して)(DocumentId、リビジョン)テーブルでグループ化された次のテーブルに変換したいと思います。

Documentid  revision  variable1 (44)  variable2 (45)  variable3(46)  variable(47)  variable (n)
12          2         Val1            Val2            null           null
12          3         null            Val3            null           null
13          1         Val4            null            null           null
13          2         null            null            Val5           null
14          1         null            null            null           Val6

変数の数は動的に取得されます。入力としてソーステーブルにいくつの変数があるかわかりません。

お知らせ下さい。

4

2 に答える 2

1

現在のテーブル構造またはサンプル データに関する多くの詳細を提供していません。そのため、これを実行するPIVOT関数のサンプルをいくつか提供します。

PIVOT には 2 つのオプションがあります。変換する列の数がわかっている場合は静的、または実行時に列のリストを取得して変換する動的です。

編集:質問の変更に基づいて、引き続き PIVOT を実行できます

静的ピボットは次のようになります ( Sql Fiddle sample ):

select *
from 
(
  select *
  from t
) x
pivot 
(
  max(value)
  for variableid in([44], [45], [46], [47])
) p

Dynamic Pivot は次のようになります ( Sql Fiddle Sample )。

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX),
    @colsAlias AS NVARCHAR(MAX)

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

SELECT @colsAlias = STUFF((SELECT DISTINCT ',' + QUOTENAME(m.variableid) + ' AS ' + QUOTENAME('variable' + cast(n.variableid as varchar(10)))  
    FROM t m INNER JOIN t n ON m.variableid = n.variableid
    FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'),1,1,'')


set @query = 'SELECT documentid, revision, ' + @colsAlias + ' from 
             (
                select *
                from t
            ) x
            pivot 
            (
                max(value)
                for variableid in (' + @cols + ')
            ) p '

execute(@query)
于 2012-06-29T17:32:34.240 に答える
0

PIVOT演算子は、探しているもののように聞こえます。MicrosoftSQLServerとMicrosoftAccessの両方で使用できますが、Sybaseで使用できるかどうかはわかりません。これに関するMSDNの記事は次のとおりです。T-SQLピボット演算子

于 2012-06-29T17:24:41.050 に答える