4

SQL Serverを深く理解し始めたばかりで、問題があります。行を列に変換する必要がありますが、理解できません。

行は次のようになります。

   Columns:      T1 T2 T3 .........T20
    Values:      1   0  9 ......... 15

私はこのようなものを受け取りたいです:

    Col  Val
    ________
    T1    1
    T2    0
    T3    9
    ........
    T20   15

私はピボットを使用する必要があることを知っています、私はこれについて読んだことがありますが、それを理解することはできません

4

1 に答える 1

6

UNPIVOTこれには、次のようにテーブル演算子を使用する必要があります。

SELECT col, val
FROM Tablename AS t
UNPIVOT
(
   Val
   FOR Col IN (T1, T2, ..., T20)
) AS u;

SQL フィドルのデモ


更新 1

手動で書き込む必要なしに、任意の数の列に対してこれを動的に実行したい場合、私が考えることができる唯一の方法は、テーブルからこれらの列を読み取って、テーブルinformation_schema.columnsの列の名前のリストを取得することです。次に、動的 SQL を使用して、次のようにステートメントをFOR col IN ...動的に構成します。

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

select @cols = STUFF((SELECT distinct ',' +
                        QUOTENAME(column_name)
                      FROM information_schema.columns
                      WHERE table_name = 'tablename'
                      FOR XML PATH(''), TYPE
                     ).value('.', 'NVARCHAR(MAX)') 
                        , 1, 1, '');

SELECT @query = ' SELECT col, val
                  FROM tablename AS t
                  UNPIVOT
                  (
                  val
                  FOR col IN ( ' + @cols + ' )
                  ) AS u;';

EXECUTE(@query);

更新された SQL Fiddle デモ

これにより、次のことが得られます。

| COL | VAL |
-------------
|  T1 |   1 |
| T10 |  15 |
| T11 |  33 |
| T12 |  31 |
| T13 |  12 |
| T14 |  10 |
| T15 |  12 |
| T16 |   9 |
| T17 |  10 |
| T18 |   2 |
| T19 |  40 |
|  T2 |   0 |
| T20 |  21 |
|  T3 |   9 |
|  T4 |   2 |
|  T5 |   3 |
|  T6 |  10 |
|  T7 |  14 |
|  T8 |  15 |
|  T9 |  20 |
于 2013-02-19T13:15:30.380 に答える