-3

次のようなテーブルがあります。

+------+----------+----------+----------+----------+
| Name | Subject1 | Subject2 | Subject3 | Subject4 |
+------+----------+----------+----------+----------+
| x    |       10 |       11 |       12 |       13 |
| y    |       20 |       21 |       22 |       23 |
| z    |       30 |       31 |       32 |       33 |
+------+----------+----------+----------+----------+

そして、出力を取得する必要があります:

Name    Subject     Mark
-------------------------------
x   Subject1    10
x   Subject2    11
x   Subject3    12
x   Subject4    13
y   Subject1    20
y   Subject2    21
y   Subject3    22
y   Subject4    23
z   Subject1    30
z   Subject2    31
z   Subject3    32
z   Subject4    33

列の番号と名前がテーブルごとに変化し続けるため、動的クエリが必要です。各テーブルには最小 56 の列があります。同様に、私は5つのテーブルを持っています。

4

2 に答える 2

1

複数の列を複数の行に変換するこのプロセスは、unpivotと呼ばれます。既知の値がある場合は、次を使用できます。

select name, subject, mark
from yourtable 
unpivot
(
  mark
  for subject in (Subject1, Subject2, Subject3, Subject4)
) unpiv;

SQL Fiddle with Demoを参照してください。

これを動的に実行する必要がある場合は、動的 SQL を使用します。

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

select @colsUnpivot 
  = stuff((select ','+quotename(C.column_name)
           from information_schema.columns as C
           where C.table_name = 'yourtable' and
                 C.column_name <> 'Name'
           for xml path('')), 1, 1, '')

set @query 
  = 'select name, subject, mark
     from yourtable
     unpivot
     (
        mark
        for subject in ('+ @colsunpivot +')
     ) u'

exec sp_executesql @query;

SQL Fiddle with Demoを参照してください。

注: データの列をアンピボットする場合、データ型が同じである必要があるため、データの変換が必要になる場合があります。

于 2013-07-22T14:46:59.760 に答える