SQL ORACLE, преобразовывающий столбцы в строки - PullRequest
0 голосов
/ 25 ноября 2018

У меня есть результат со столбцами Indice, valeur1 и т. Д .:

Indice value1 value2 value3 value4

1 x математика физика химия

2 21/01/18 133184 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

Я хочу переместить столбцы в строкив результате.Не могли бы вы предложить мне возможные решения.

Ответы [ 2 ]

0 голосов
/ 25 ноября 2018

Вам нужно 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

По умолчанию нулевые значения исключены.Вы можете включить их, добавив include nulls после ключевого слова unpivot.

Чтобы включить INDICE в столбец VALEUR, вы можете переместить его из списка 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 строк на основе ваших данных выборки.

0 голосов
/ 25 ноября 2018

Вам нужно использовать что-то вроде

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