15

データベースに、同じ種類のデータを含む 9 つの列を持つテーブルがあります。これらの値はnull にすることができます。null 以外の値のそれぞれを、元の行の ID を気にしない値の単一の列に選択する必要があります。

したがって、次のようなテーブルの場合:

+---------+------+--------+------+
|   Id    | I1   | I2     | I3   | 
+---------+------+--------+------+
|    1    | x1   | x2     |  x7  |
|    2    | x3   | null   |  x8  |
|    3    | null | null   |  null|
|    4    | x4   | x5     |  null|
|    5    | null | x6     |  x9  |
+---------+------+--------+------+

x で始まる各値を 1 つの列に選択したいと考えています。結果のデータは次の表のようになります。順序を維持する必要があるため、最初の行の最初の列の値が一番上にあり、最後の行の最後の列の値が一番下にある必要があります。

+-------+
| value |
+-------+
|  x1   |
|  x2   |
|  x7   |
|  x3   |
|  x8   |
|  x4   |
|  x5   |
|  x6   |
|  x9   |
+-------+

SQL Server 2008 R2を使用しています。各列の値を各行から順番に選択し、null 以外の値を結果に挿入するよりも、これを達成するためのより良い手法はありますか?

4

3 に答える 3

28

UNPIVOT 関数を使用して最終結果を取得できます。

select value
from yourtable
unpivot
(
  value
  for col in (I1, I2, I3)
) un
order by id, col;

SQL Server 2008+ を使用しているため、CROSS APPLY を VALUES 句と共に使用して、列のピボットを解除することもできます。

select value
from yourtable
cross apply
(
    values
        ('I1', I1),
        ('I2', I2),
        ('I3', I3)
) c(col, value)
where value is not null
order by id, col
于 2013-10-22T11:00:48.187 に答える
6
SELECT value FROM (
   SELECT ID, 1 AS col, I1 AS [value] FROM t
   UNION ALL SELECT ID, 2,  I2 FROM t
   UNION ALL SELECT ID, 3,  I3 FROM t
) AS t WHERE value IS NOT NULL ORDER BY ID, col;
于 2013-10-22T10:56:47.247 に答える
5

以下のようにユニオンを試してください:

    select value from
(
    select col1 as value from TestTable
    union
    select col2 as value from TestTable
    union
    select col3 as value from TestTable
) tt where value is not null
于 2013-10-22T11:00:17.537 に答える