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

1 210 90  160  99 
2 111 89  120  76 

Ich möchte wie diese übertragen Tisch (jedes Mal, ich nur ein Benutzerhandbuch Aufzeichnungen wollen.),
Tabelle transformieren, um auf eine andere Art und Weise Oracle

Column_names Values 

G_NEWS  90 
L_NEWS  160 
R_NEWS  99 

Durch folgende Abfrage mit i das abrufen können Spaltennamen, aber wie kann ich diesen Wert des bestimmten Benutzers erhalten.

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

Welche Sie verwenden RDBMS bietet .. Ist es Oracle, MySQL oder Sql Server? – User

+0

@Srinath das ist Oracle – TechGuy

+2

Sie brauchen 'pivot', wenn Sie Oracle 11 http://StackOverflow.com/Questions/19124891/oracle-unpivot-Columns-ToRows- oder einige pre-pivivot Lösung wie das http: // verwenden stackoverflow.com/questions/19280591/oracle-pivot-operator Wenn Sie pre-11g verwenden – Kacper

Antwort

0

Der einfache Weg ist wie der Kommentar oben;

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 

Und das Ergebnis;

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

Spaltennamen wie G_NEWS können dynamisch wachsen. – TechGuy

+0

Ich schlage vor, Sie bearbeiten die Frage, um das klar zu machen. – BriteSponge

1

es klingt, als unpivot Probe doc siehe hier: unpivot sample wenn Spalten dynamisch geändert werden kann - es kann dynamische SQL sein, die Liste der Spalten

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

Eine Einschränkung von PIVOT/UNPIVOT besteht darin, dass die Werte für column_name vorne bekannt sein müssen. Das OP hat in einem anderen Kommentar gesagt, dass es möglicherweise mehr% _NEWS-Spalten gibt. Wenn Sie wissen, wie man damit umgeht, wäre ich sehr interessiert. – BriteSponge

+0

Siehe diesen Thread zu diesem http://StackOverflow.com/Questions/11881162/unpivot-Table-with-multiple-columns-and-dynamic-column-names. 2. Antwort gibt es über dynamische sql – are

Verwandte Themen