2

さて、400 などの多数の列を含むデータがあります。

UID, ID, ID, var1, var2, . . . var400

1, 23,  4651,  0,     0, . . .   1
2, 47,  8567,  1,     1, . . .   5

次のように積み重ねる必要があります。

UID, ID, ID,    Variable,  Value
1,   23, 4651    var1,       0
1,   23, 4651    var2,       0
. . .
1,   23, 4651    var400,     1
2,   47, 8567,   var1        1
2,   47, 8567,   var2        1
. . . 
2,   47, 8567,   var400      5

この変換を実行するための比較的簡単な方法がいくつかあるはずです。でもそれが何なのか思いつかない。誰にもアイデアはありますか?

4

2 に答える 2

4

OK、これは SQL Server 2005 以降で機能します。の静的バージョンがありUNPIVOTます:

SELECT UID, ID1, ID2, Variable, Value
FROM (SELECT * FROM YourTable) T
UNPIVOT (Value FOR Variable IN (var1, var2, ....var400)) AS U;

これは、これのデモを含む sqlfiddleです。

これは機能しますが、400 列すべてを記述する必要があります。それをしたくない場合 (ただし、実行することをお勧めします)、最初に列名を抽出して動的 SQL を使用できます。

DECLARE @sql NVARCHAR(MAX), @cols NVARCHAR(MAX)

SELECT @cols = STUFF((SELECT DISTINCT ',' + QUOTENAME(COLUMN_NAME) 
                      FROM INFORMATION_SCHEMA.COLUMNS
                      WHERE TABLE_NAME = 'YourTable'
                      AND COLUMN_NAME LIKE 'Var%'
               FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'),1,1,'')

SET @sql = '
SELECT UID, ID1, ID2, Variable, Value
FROM (SELECT * FROM YourTable) T
UNPIVOT (Value FOR Variable IN ('+@cols+')) AS U;'

EXEC(@sql)

そして、ここに動的バージョンの sqlfiddleがあります。

于 2013-03-20T20:44:24.410 に答える
2

CROSS APPLYSQL Server 2008+ を使用している場合は、次のように使用できますVALUES

select t.uid,
  t.id1,
  t.id2,
  c.variable,
  c.value
from YourTable t
cross apply
(
  values 
    ('var1', t.var1),
    ('var2', t.var2),
    ('var3', t.var3)
) c (variable, value);

デモで SQL Fiddle を参照してください。fiddle について @Lamak に感謝します

于 2013-03-20T20:54:52.657 に答える