2017-03-05 1 views
0

Avec une table grades qui contient l'histogramme des notes pour les étudiants comme ci-dessous, il faut unpivot convertir les noms de colonnes en index.données d'histogramme non-pivot des valeurs discrètes

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); 

Les nuances peuvent être indexées en valeurs numériques - par exemple comme ci-dessous.

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

Sortie prévue

+-------+-------+ 
| 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 | 
+-------+-------+ 

La question et la réponse here montre le chemin postgres de le faire.

+0

sont des noms uniques ou existe-t-il une colonne id? – GurV

+0

@GurV ils peuvent être considérés comme uniq. – user3206440

Répondre

0

Essayez ceci:

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; 

A l'intérieur du CTE, nous unpivoting la table de conversion des colonnes dire en lignes. Ensuite, nous utilisons des requêtes hiérarchiques pour générer autant de lignes qu'il y a de notes pour un nom donné et un type de note. Disclaimer- Tested only on Oracle (après avoir ajouté la double table requise à certains endroits) car la syntaxe correspond le plus souvent. Non testé sur Netezza.

+0

Netezza ne prend pas en charge les requêtes hiérarchiques – NzGuy

+0

@NzGuy - Ce site indique le contraire - https://www.ibm.com/support/knowledgecenter/fr/SSGU8G_11.70.0/com.ibm.sqls.doc/ids_sqs_2033.htm – GurV

+0

Récursif les requêtes ne sont pas supportées par netezza à partir de maintenant 7.2. https://www.ibm.com/support/knowledgecenter/en/SSULQD_7.2.1/com.ibm.nz.dbu.doc/r_dbuser_with_clause.html – NzGuy