2017-03-05 5 views
0

Mit einer Tabelle grades, die Histogramm Noten für Studenten wie unten enthält, müssen es konvertieren die Spaltennamen in Indizes.Un-Pivot Histogramm Daten von diskreten Werten

CREATE TABLE grades 
AS 
    SELECT name, exams, grade_poor, grade_fair, grade_good, grade_vgood 
    FROM (VALUES 
    ('arun' , 8 , 1 , 4 , 2 , 1), 
    ('neha' , 10 , 3 , 2 , 1 , 4), 
    ('ram' , 5 , 1 , 1 , 3 , 0), 
    ('radha' , 8 , 0 , 3 , 1 , 4) 
) AS t(name,exams,grade_poor,grade_fair,grade_good,grade_vgood); 

Die Noten können auf numerische Werte indiziert werden - zum Beispiel als unten.

+-------------+--------+ 
| grade | value | 
+-------------+--------+ 
| grade_poor |  1 | 
| grade_fair |  2 | 
| grade_good |  3 | 
| grade_vgood |  4 | 
+-------------+--------+ 

Erwartete Ausgabe

+-------+-------+ 
| name | grade | 
+-------+-------+ 
| arun |  1 | 
| arun |  2 | 
| arun |  2 | 
| arun |  2 | 
| arun |  2 | 
| arun |  3 | 
| arun |  3 | 
| arun |  4 | 
| neha |  1 | 
| neha |  1 | 
| neha |  1 | 
| neha |  2 | 
| neha |  2 | 
| neha |  3 | 
| neha |  4 | 
| neha |  4 | 
| neha |  4 | 
| neha |  4 | 
| radha |  2 | 
| radha |  2 | 
| radha |  2 | 
| radha |  3 | 
| radha |  4 | 
| radha |  4 | 
| radha |  4 | 
| radha |  4 | 
| ram |  1 | 
| ram |  2 | 
| ram |  3 | 
| ram |  3 | 
| ram |  3 | 
+-------+-------+ 

Die Frage und Antwort here zeigt die Postgres Art und Weise tun.

+0

sind Namen eindeutig oder gibt es eine ID-Spalte? – GurV

+0

@ GurV sie können als uniq betrachtet werden. – user3206440

Antwort

0

Try this:

with up_grades as (
    select 
     g.name, 
     x.i grade_type, 
     case x.i 
      when 1 then grade_poor 
      when 2 then grade_fair 
      when 3 then grade_good 
      when 4 then grade_vgood 
     end grades 
    from grades g 
    cross join (
     select 1 i union all 
     select 2 i union all 
     select 3 i union all 
     select 4 i 
    ) x 
) 
select g.name, g.grade_type 
from up_grades g 
join (
    select level n 
    connect by 
     level <= (select max(grades) from up_grades) 
) c on g.grades >= c.n 
order by g.name, g.grade_type; 

Im Inneren des CTE, unpivoting wir die Tabelle heißt die Spalten in Zeilen umzuwandeln. Dann verwenden wir hierarchische Abfragen, um so viele Zeilen zu generieren, wie es Klassen für einen Given-Namen und einen Einstufungstyp gibt.

Disclaimer- Tested only on Oracle (nach dem Hinzufügen der erforderlichen Dual-Tabelle an Orten) als die Syntax meist übereinstimmt. Nicht getestet auf Netezza.

+0

Netezza unterstützt keine hierarchischen Abfragen – NzGuy

+0

@NzGuy - Diese Website sagt nichts anderes - https://www.ibm.com/support/knowledgecenter/de/SSGU8G_11.70.0/com.ibm.sqls.doc/ids_sqs_2033.htm – GurV

+0

Rekursiv Abfragen werden von netezza ab sofort nicht unterstützt. 7.2. https://www.ibm.com/support/knowledgecenter/de/SSULQD_7.2.1/com.ibm.nz.dbu.doc/r_dbuser_with_clause.html – NzGuy