繁体   English   中英

SQL ORACLE将列转换为行

[英]SQL ORACLE converting columns into rows

我将Indice,valeur1等列的结果显示为:

指数值1值2值3值4

1 x数学物理化学

2 21/01/18 133 184 115

我想以垂直方式显示结果

Indice,1,2
valeur1, x,21/01/2018
valeur2,maths, 133
valeur3,physics,184
valeur4,chemistry ,115
...
...
...
...

我的查询:

    select
    'x' as Valeur1,
    'maths' as Valeur2,
    'physics' as Valeur3, 
    'Chemistry' as Valeur4, 
    null as Valeur5, 
    null as Valeur6, 
    null as Valeur7, 
    null as Valeur8, 
    null as Valeur9, 
    null as Valeur10 
    from dual
    union
    select
        2 as indice,
      to_char((x) ) as Valeur1,
      to_char(sum(maths)) as valeur2,
      to_char(sum(physics)) as valeur3,
      to_char(sum(chemisty)) as valeur4,
      null as Valeur5, 
      null as Valeur6, 
      null as Valeur7, 
      null as Valeur8, 
      null as Valeur9, 
      null as Valeur10 

 from t1

我想将列转置为结果行。 您能否建议我可能的解决方案。

您需要UNPIVOT

select * from unpivotdemo;

    INDICE VALEUR1              VALEUR2              VALEUR3              VALEUR4              VALEUR5              VALEUR6              VALEUR7              VALEUR8              VALEUR9              VALEUR10
---------- -------------------- -------------------- -------------------- -------------------- -------------------- -------------------- -------------------- -------------------- -------------------- --------------------
         1 Semaine courante     Semaine precedente   Semaine -2                                                                                                                                         
         2 03/10/18             184                  115                                                                                                                                                

select indice, valeur, description
from   unpivotdemo
unpivot
     ( description for valeur in
       ( valeur1
       , valeur2
       , valeur3
       , valeur4
       , valeur5
       , valeur6
       , valeur7
       , valeur8
       , valeur9
       , valeur10 ) );

    INDICE VALEUR   DESCRIPTION
---------- -------- --------------------
         1 VALEUR1  Semaine courante
         1 VALEUR2  Semaine precedente
         1 VALEUR3  Semaine -2
         2 VALEUR1  03/10/18
         2 VALEUR2  184
         2 VALEUR3  115

6 rows selected

默认情况下,排除空值。 您可以通过在unpivot关键字之后添加include nulls来包含它们。

包括INDICEVALEUR列,你可以从它移到select列表中unpivot ... in名单-但是你还需要将数据类型转换为相匹配:

select valeur, description
from   ( select to_char(indice) as indice
               , valeur1, valeur2, valeur3, valeur4, valeur5, valeur6, valeur7, valeur8, valeur9, valeur10
         from   unpivotdemo d )
unpivot include nulls
     ( description for valeur in
       ( indice
       , valeur1
       , valeur2
       , valeur3
       , valeur4
       , valeur5
       , valeur6
       , valeur7
       , valeur8
       , valeur9
       , valeur10 ) );

VALEUR   DESCRIPTION
-------- ----------------------------------------
INDICE   1
VALEUR1  Semaine courante
VALEUR2  Semaine precedente
VALEUR3  Semaine -2
VALEUR4  
VALEUR5  
VALEUR6  
VALEUR7  
VALEUR8  
VALEUR9  
VALEUR10 
INDICE   2
VALEUR1  03/10/18
VALEUR2  184
VALEUR3  115
VALEUR4  
VALEUR5  
VALEUR6  
VALEUR7  
VALEUR8  
VALEUR9  
VALEUR10 

22 rows selected

编辑以下扩展问题:

要将值聚合为逗号分隔的字符串,可以使用LISTAGG

select valeur, description
from   ( select listagg(indice, ',')   within group (order by indice) as indice
              , listagg(valeur1, ',')  within group (order by indice) as valeur1
              , listagg(valeur2, ',')  within group (order by indice) as valeur2
              , listagg(valeur3, ',')  within group (order by indice) as valeur3
              , listagg(valeur4, ',')  within group (order by indice) as valeur4
              , listagg(valeur5, ',')  within group (order by indice) as valeur5
              , listagg(valeur6, ',')  within group (order by indice) as valeur6
              , listagg(valeur7, ',')  within group (order by indice) as valeur7
              , listagg(valeur8, ',')  within group (order by indice) as valeur8
              , listagg(valeur9, ',')  within group (order by indice) as valeur9
              , listagg(valeur10, ',') within group (order by indice) as valeur10
         from   unpivotdemo )
unpivot include nulls
     ( description for valeur in
       ( indice
       , valeur1
       , valeur2
       , valeur3
       , valeur4
       , valeur5
       , valeur6
       , valeur7
       , valeur8
       , valeur9
       , valeur10 ) );

VALEUR   DESCRIPTION
-------- --------------------------------------------------------------------------------
INDICE   1,2
VALEUR1  Semaine courante,03/10/18
VALEUR2  Semaine precedente,184
VALEUR3  Semaine -2,115
VALEUR4  
VALEUR5  
VALEUR6  
VALEUR7  
VALEUR8  
VALEUR9  
VALEUR10 

11 rows selected

请注意,逗号分隔的字符串可能会变长,并且默认情况下,您被限制为4000个字符,根据示例数据,这可能是大约200行。

您需要使用类似

select * from (
    select indice from table union all
    select value1 from table union all
    select value2....union all
    select last from table
)

否则将unpivot用作

select column from table
unpivot ( column for column in (indice, value1, ... valuen) )

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM