我有一个包含数百行和数十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
编辑:我很清楚我正在使用可怕的数据库“设计”。不幸的是我无法改变它。这个问题实际上是我今天提出的一个更大问题的一部分。我明天会尝试给出的想法
答案 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