2012-12-20 6 views

Répondre

2

Essayez:

SELECT y1 FROM yourtable 
UNION ALL 
SELECT y2 FROM yourtable 
UNION ALL 
SELECT y3 FROM yourtable 
+0

merci beaucoup pour votre aide. Je peux voir comment cela va fonctionner. – MrHopko

1

Si l'on suppose, il est une clé primaire sur la ligne, disons, ID:

ID Y1 Y2 Y3 
    1 100 200 300 

Ensuite, ce genre de chose devrait fonctionner

SELECT MOCKTABLE.* FROM (
    SELECT 1 AS Year, Y1 AS VALUE FROM x WHERE ID = y 
    UNION ALL 
    SELECT 2 AS Year, Y2 AS VALUE FROM x WHERE ID = y 
    UNION ALL 
    SELECT 3 AS Year, Y3 AS VALUE FROM x WHERE ID = y 
) MOCKTABLE 
2

En SQL Server 2005+, vous pouvez utiliser la fonction UNPIVOT:

select replace(col, 'Y', '') year, 
    value 
from yourtable 
unpivot 
(
    value 
    for col in (Y1, Y2, Y3) 
) unpiv 

Voir SQL Fiddle with Demo

Ce processus est le même que l'utilisation d'une UNION ALL requête:

select 1 Year, Y1 value 
from yourtable 
union all 
select 2 Year, Y2 value 
from yourtable 
union all 
select 3 Year, Y3 value 
from yourtable 

Voir SQL Fiddle with Demo

deux produira le même résultat:

| YEAR | VALUE | 
---------------- 
| 1 | 100 | 
| 2 | 200 | 
| 3 | 300 | 
0

A manière générale de Les colonnes unpivot permettent de créer un produit cartésien avec une table contenant autant de lignes que vous le souhaitez. La façon dont vous obtenez cette "table" dépend du SGBDR que vous utilisez. Voici un exemple Oracle:

select 
r "Year", 
case r when 1 then y1 when 2 then y2 when 3 then y3 else null end "Value" 
from 
t1, (select level r from dual connect by level <= 3) 

Ce qui donne:

Year Value 
1 100 
2 200 
3 300 

une autre façon de le faire ...

Questions connexes