2016-11-09 1 views
0

Je table comme ce stockée dans PostgreSQL:Comment remodeler un enregistrement de ligne spécifique dans PostgreSQL?

enter image description here

Dans mon cas, je dois sélectionner la ligne spécifique (par exemple ID = 1), puis remodeler cette ligne sélectionnée, de sorte que la sortie sera comme ceci:

enter image description here

est possible de faire cette logique dans la requête SQL unique? Quelqu'un m'a dit d'utiliser « crosstab », mais je ne peux pas trouver le moyen de le résoudre ..

Répondre

0

Je pourrais simplement suggérer union all:

select 2010 as id_year, A_2010 as a, b_2010 as b from t 
union all 
select 2011 as id_year, A_2011 as a, b_2011 as b from t 
union all 
select 2012 as id_year, A_2012 as a, b_2012 as b from t 
union all 
select 2013 as id_year, A_2013 as a, b_2013 as b from t; 

Cependant, une jointure latérale pourrait être plus efficace:

select v.* 
from t, lateral 
    (values (2010, A_2010, B_2010), (2011, A_2011, B_2011), 
      (2012, A_2012, B_2012), (2013, A_2013, B_2013) 
    ) v(id_year, A, B); 
+0

Merci, latéral joindre résoudre mon problème – Faizalprbw

0
with t(id, A_2010,A_2011,A_2012,A_2013,B_2010,B_2011,B_2012,B_2013) as (values 
    (1,'value 1','value 4','value 7','value 10','value 13','value 16','value 19','value 21') 
) 
select 
    unnest(array[2010,2011,2012,2013]) as "ID_YEAR", 
    unnest(array[A_2010,A_2011,A_2012,A_2013]) as "A", 
    unnest(array[B_2010,B_2011,B_2012,B_2013]) as "B" 
from t 
where id = 1 
; 
ID_YEAR | A  | B  
---------+----------+---------- 
    2010 | value 1 | value 13 
    2011 | value 4 | value 16 
    2012 | value 7 | value 19 
    2013 | value 10 | value 21 
+0

Merci, cette méthode me aider dans d'autres cas .. – Faizalprbw