【问题标题】:SQL - multiple columns into rowsSQL - 多列成行
【发布时间】:2014-01-31 00:25:14
【问题描述】:

我正在使用 Oracle,我想将一个查询转换为多行。

这是我的查询:

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 等转换为不同的行,如 CD_TURMA。好吧,基本上使用第一个字段作为键,其他字段作为值,将它们从列更改为行...

有可能吗?

【问题讨论】:

  • 是的,这是可能的。只需查找有关 Oracle Pivot 的教程或stackoverflow.com/questions/17060044/…
  • COALESCE(I.cd_turma_t, I.cd_turma_p, I.cd_turma_l, I.cd_turma_tp, ...) IS NOT NULL比较短

标签: sql oracle unpivot


【解决方案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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 2013-12-31
    • 1970-01-01
    • 1970-01-01
    • 2014-07-24
    • 2011-12-07
    • 1970-01-01
    相关资源
    最近更新 更多