4

多くの同じ列を使用する複数のトラッカーのシステムを構築しているため、トラッカー、トラッカー列、およびユーザーがトラッカーを挿入したときにどの列がどのトラッカーに対応するかの相互参照のテーブルがあります行 異なる列の値は、同じレコード ID を共有し、特定の列の値と名前の両方を格納する複数の行に格納されます。

値の列名を同じ行に格納されている列名に動的に変更する方法を見つける必要があります。

すなわち

id | value | name
------------------
23 | red   | color
23 | fast  | speed

このように見える必要があります。

id | color | speed
------------------
23 | red   | fast

どんな助けでも大歓迎です、ありがとう。

4

2 に答える 2

10

このタイプのクエリは、PIVOT. 列の値をハードコーディングする静的ピボットと、実行時に列が決定される動的ピボットの 2 つの方法があります。

静的ピボット( SQL Fiddle with Demoを参照)

select *
from 
(
  select id, value, name
  from test
) x
pivot
(
  min(value)
  for name in ([color], [speed])
) p

動的ピボット( SQL Fiddle with Demoを参照)

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

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


set @query 
      = 'SELECT id,' + @cols + ' from 
         (
            SELECT id, value, name
            FROM test
         ) x
         pivot 
         (
            min(value)
            for name in (' + @cols + ')
         ) p '

execute(@query)

どちらのクエリでも同じ結果が得られます。違いは、最初に、列にしたいすべての値をコーディングする必要があることです。

于 2012-08-18T15:27:17.093 に答える
0

不可能だよ。SQL Server では、列名は常に静的です。ただし、動的 ​​SQL を生成できます。

于 2012-07-02T21:13:58.253 に答える