SQL在不同的行上选择每个选定列的值

时间:2011-08-17 13:43:50

标签: sql select

我有一个包含数百行和数十W列的表:

Column1 | Column2_W | Column3_W | ColumnX_W
  123   |     A     |     B     |    x
  223   |     A     |    NULL   |  NULL

如何选择它以使输出为:

Column1 | W 
  123   | A
  123   | B
  123   | x
  223   | A
编辑:我很清楚我正在使用可怕的数据库“设计”。不幸的是我无法改变它。这个问题实际上是我今天提出的一个更大问题的一部分。我明天会尝试给出的想法

3 个答案:

答案 0 :(得分:6)

SELECT Column1, Column2_W
FROM table

UNION ALL

SELECT Column1, Column3_W
FROM table

UNION ALL

SELECT Column1, Column4_W
FROM table
....
ORDER BY Column1

更好的选择:重新设计您的数据库!这看起来像电子表格,而不是关系数据库。

答案 1 :(得分:3)

看一下这篇文章:UNPIVOT: Normalizing data on the fly

不幸的是,您将无法使用您使用的任何解决方案键入列名称。以下是在SQL Server中使用UNPIVOT的示例...

SELECT Column1, W
FROM YourTable
UNPIVOT (W for Column1 in (Column2_W, Column3_W /* and so on */)) AS W

答案 2 :(得分:0)

如果您没有任何UNPIVOT选项......

SELECT
  Column1,
  CASE ColumnID WHEN 2 THEN Column2_W
                WHEN 3 THEN Column3_W
                ...
                WHEN X THEN ColumnX_W
  END AS Column2
FROM
  yourTable
CROSS JOIN
  (          SELECT 2 AS ColumnID
   UNION ALL SELECT 3
   ...
   UNION ALL SELECT X
  )
    AS UnPivot