2016-11-23 1 views
0
ID UserId G_NEWS L_NEWS R_NEWS 

1 210 90  160  99 
2 111 89  120  76 

Je veux transférer la table comme celui-ci (Chaque fois que je veux un des dossiers de l'utilisateur uniquement.),
Table de transformation pour une autre façon Oracle

Column_names Values 

G_NEWS  90 
L_NEWS  160 
R_NEWS  99 

En utilisant la requête suivante je peux récupérer la noms de colonnes, mais comment puis-je obtenir cette valeur de l'utilisateur spécifique.

SELECT COLUMN_NAME 
FROM ALL_TAB_COLUMNS 
WHERE TABLE_NAME='TBL_NEWS'; 
+0

Ce qui SGBDR que vous utilisez .. Est-ce Oracle, MySQL ou SQL Server? – User

+0

@Srinath c'est Oracle – TechGuy

+2

Vous devez 'unpivot' si vous utilisez Oracle 11 http://stackoverflow.com/questions/19124891/oracle-unpivot-columns-to-rows ou une solution pré-unpivot comme celle http: // stackoverflow.com/questions/19280591/oracle-pivot-operator si vous utilisez pre-11g – Kacper

Répondre

0

La méthode simple est conforme au commentaire ci-dessus;

create table test_table 
(id number,userid number,g_news number, l_news number, r_news number) 
/
insert into test_table 
VALUES(1,210,90,160,99) 
/
insert into test_table 
VALUES(2,211,89,120,76) 
/
commit 
/

SELECT 'G_NEWS' AS column_name ,g_news AS col_values FROM test_table WHERE id = 1 
union all 
SELECT 'L_NEWS',l_news FROM test_table WHERE id = 1 
union all 
SELECT 'R_NEWS',r_news FROM test_table WHERE id = 1 

Et le résultat;

COLUMN COL_VALUES 
------ ---------- 
G_NEWS   90 
L_NEWS  160 
R_NEWS   99 
+0

Les noms de colonne tels que G_NEWS peuvent croître dynamiquement. – TechGuy

+0

Je vous suggère de modifier la question pour que ce soit clair. – BriteSponge

1

il semble que unpivot voir l'exemple doc ici: unpivot sample si les colonnes peuvent être modifiés dynamiquement - il peut être sql dynamique qui fournit la liste des colonnes

with matrix as(
select 
    1 as ID 
    ,210 as UserId 
    ,90 as G_NEWS 
    ,160 as L_NEWS 
    ,99 as R_NEWS 
from dual 
union all 
select 
    2 as ID 
    ,111 as UserId 
    ,89 as G_NEWS 
    ,120 as L_NEWS 
    ,76 as R_NEWS 
    from dual) 
select column_name, val from matrix 
unpivot 
(
    val 
    for column_name in ("G_NEWS","L_NEWS","R_NEWS") 
) 
where userId = 111 
order by userId, column_name 

result of test query for user 111: 
1 G_NEWS 89 
2 L_NEWS 120 
3 R_NEWS 76 
+0

Une limitation de PIVOT/UNPIVOT est que les valeurs de column_name doivent être connues dès le début. L'OP a dit dans un autre commentaire qu'il pourrait y avoir plus de colonnes% _NEWS. Si vous savez comment gérer cela, je serais très intéressé. – BriteSponge

+0

voir ce sujet à ce sujet http://stackoverflow.com/questions/11881162/unpivot-table-with-multiple-columns-and-dynamic-column-names. 2ème réponse il y a à propos de SQL dynamique – are