2014-01-30 65 views
1

我使用的是Oracle,我希望打开一个查询,该查询将多个列分成几行。SQL - 将多个列分成若干行

这是我的我的查询:

SELECT I.cd_curso, 
     I.cd_discip, 
     ND.ds_discip, 
     I.cd_turma_t, 
     I.cd_turma_p, 
     I.cd_turma_l, 
     I.cd_turma_tp, 
     I.cd_turma_e, 
     I.cd_turma_o, 
     I.cd_turma_c, 
     I.cd_turma_s, 
     Count(*) AS alunos 
FROM cse.v_vwinscri I, 
     cse.t_tbdiscip ND 
WHERE I.cd_lectivo = 201314 
     AND I.cd_discip = 911901 
     AND I.cd_discip = ND.cd_discip 
     AND I.cd_curso = 9885 
     AND (I.cd_turma_t IS NOT NULL 
       OR I.cd_turma_p IS NOT NULL 
       OR I.cd_turma_l IS NOT NULL 
       OR I.cd_turma_tp IS NOT NULL 
       OR I.cd_turma_e IS NOT NULL 
       OR I.cd_turma_o IS NOT NULL 
       OR I.cd_turma_c IS NOT NULL 
       OR I.cd_turma_s IS NOT NULL) 
GROUP BY I.cd_curso, 
      I.cd_discip, 
      ND.ds_discip, 
      I.cd_turma_t, 
      I.cd_turma_p, 
      I.cd_turma_l, 
      I.cd_turma_tp, 
      I.cd_turma_e, 
      I.cd_turma_o, 
      I.cd_turma_c, 
      I.cd_turma_s 
ORDER BY I.cd_curso, 
      I.cd_turma_t, 
      I.cd_turma_p, 
      I.cd_turma_l, 
      I.cd_turma_tp, 
      I.cd_turma_e, 
      I.cd_turma_o, 
      I.cd_turma_c, 
      I.cd_turma_s 

我希望把结果CD_TURMA_T,CD_TURMA_P,等等,进入diferent行作为CD_TURMA。那么基本上使用第一菲尔斯作为键和其他值,将它们从列更改为行...

这可能吗?

+0

是的,它是possible.Just寻找教程甲骨文透视或http://stackoverflow.com/questions/17060044/how-to-transpose-a -table-from-columns-to-rows-in-oracle-sql –

+0

编写'COALESCE(I.cd_turma_t,I.cd_turma_p,I.cd_turma_l,I.cd_turma_tp,...)不是NULL' –

回答

1

您可以简单地使用UNION ALL这样的:

WITH cte AS (
    SELECT I.cd_curso, 
      I.cd_discip, 
      ND.ds_discip, 
      I.cd_turma_t, 
      I.cd_turma_p, 
      I.cd_turma_l, 
      I.cd_turma_tp, 
      I.cd_turma_e, 
      I.cd_turma_o, 
      I.cd_turma_c, 
      I.cd_turma_s, 
      Count(*) AS alunos 
    FROM cse.v_vwinscri I, 
      cse.t_tbdiscip ND 
    WHERE I.cd_lectivo = 201314 
      AND I.cd_discip = 911901 
      AND I.cd_discip = ND.cd_discip 
      AND I.cd_curso = 9885 
      AND (I.cd_turma_t IS NOT NULL 
        OR I.cd_turma_p IS NOT NULL 
        OR I.cd_turma_l IS NOT NULL 
        OR I.cd_turma_tp IS NOT NULL 
        OR I.cd_turma_e IS NOT NULL 
        OR I.cd_turma_o IS NOT NULL 
        OR I.cd_turma_c IS NOT NULL 
        OR I.cd_turma_s IS NOT NULL) 
    GROUP BY I.cd_curso, 
       I.cd_discip, 
       ND.ds_discip, 
       I.cd_turma_t, 
       I.cd_turma_p, 
       I.cd_turma_l, 
       I.cd_turma_tp, 
       I.cd_turma_e, 
       I.cd_turma_o, 
       I.cd_turma_c, 
       I.cd_turma_s) 
SELECT cd_curso, 
     cd_discip, 
     ds_discip, 
     cd_turma_t AS cd_trauma, 
     alunos 
FROM cte 
UNION ALL 
SELECT cd_curso, 
     cd_discip, 
     ds_discip, 
     cd_turma_p, 
     alunos 
FROM cte 
UNION ALL 
SELECT cd_curso, 
     cd_discip, 
     ds_discip, 
     cd_turma_l, 
     alunos 
FROM cte 
UNION ALL 
SELECT cd_curso, 
     cd_discip, 
     ND.ds_discip, 
     cd_turma_tp, 
     alunos 
FROM cte 
UNION ALL 
SELECT cd_curso, 
     cd_discip, 
     ds_discip, 
     cd_turma_e, 
     alunos 
FROM cte 
UNION ALL 
SELECT cd_curso, 
     cd_discip, 
     ds_discip, 
     cd_turma_o, 
     alunos 
FROM cte 
UNION ALL 
SELECT cd_curso, 
     cd_discip, 
     ds_discip, 
     cd_turma_c, 
     alunos 
FROM cte 
UNION ALL 
SELECT cd_curso, 
     cd_discip, 
     ds_discip, 
     cd_turma_s, 
     alunos 
FROM cte;