2011-08-17 84 views
3

我有一个表有数百W色谱柱的行和几十:SQL选择值

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

是否使用的是RDBMS? – Yuck

+0

建议你看看不透明。希望你这样做是为了将这些数据转换为更规范化的格式,因为这是一种长期存储数据的可怕方法。 – HLGEM

回答

2

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

Unforunately,你会被卡住的手与任何使用的解决方案键入列名。下面是使用SQL Server UNPIVOT样本...

SELECT Column1, W 
FROM YourTable 
UNPIVOT (W for Column1 in (Column2_W, Column3_W /* and so on */)) AS W 
4
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 

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

+0

我知道这看起来如何,我很沮丧地使用这样的数据库。不幸的是,我没有办法做到DB设计 – FableBlaze

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