Как сделать pivot в plsql - PullRequest
       2

Как сделать pivot в plsql

0 голосов
/ 20 декабря 2018

У меня есть данные, подобные этим

Col_A     Col_B      Col_C    Value    Col_E
Id_1    String_a   type1      null     Flat
Id_1    String_a   type2      30       Not Flat
Id_1    String_b   type1      null     Flat
Id_1    String_b   type2      30       Not Flat
Id_2    String_c   type1      35       Flat
Id_2    String_c   type2      55       Flat

Я хочу, чтобы выходные данные были такими, как показано ниже

Col_A    type1_Col_E  type1  type1_count type2_Col_E  type_2 type2_count
Id_1     Flat         null   0           Not Flat     30     2
Id_2     Flat         35     1           Flat         35     1

Мне нужно, чтобы все типы были в столбце, и нужно считать как другой столбецдля каждого своего типа.Так что, если у меня есть 2 строки, связанные с одним идентификатором, у меня должно быть число 2 в его типе.Мне нужно иметь все типы в виде столбца, и мне нужно иметь счетчик, чтобы указать, сколько строк было связано с каждым типом.Если значение равно нулю, я должен считать число равным нулю.

Возможно ли достичь этого с помощью PL SQL?

1 Ответ

0 голосов
/ 20 декабря 2018

Вам не нужен оператор PL/SQL, но SQL Select с коррелированными подзапросами, как показано ниже, лучше всего подходит для вашего случая, как показано ниже:

with tab( Col_A, Col_B, Col_C, Value, Col_E ) as
(
 select 'Id_1','String_a','type1',null,'Flat'     from dual union all
 select 'Id_1','String_a','type2',  30,'Not Flat' from dual union all
 select 'Id_1','String_b','type1',null,'Flat'     from dual union all
 select 'Id_1','String_b','type2',  30,'Not Flat' from dual union all
 select 'Id_2','String_c','type1',  35,'Flat'     from dual union all
 select 'Id_2','String_c','type2',  55,'Flat'     from dual 
)
select Col_A,
       ( select distinct Col_E from tab where Col_A = t.Col_A and Col_C = 'type1' ) 
         as type1_Col_E,
       ( select distinct value from tab where Col_A = t.Col_A and Col_C = 'type1' )   
         as type1,
       ( select sum(nvl2(value,1,0)) from tab where Col_A = t.Col_A and Col_C = 'type1' )   
         as type1_count,
       ( select distinct Col_E from tab where Col_A = t.Col_A and Col_C = 'type2' ) 
         as type2_Col_E,
       ( select distinct value from tab where Col_A = t.Col_A and Col_C = 'type2' )   
         as type2,
       ( select sum(nvl2(value,1,0)) from tab where Col_A = t.Col_A and Col_C = 'type2' )   
         as type2_count                        
      from tab t
     group by t.Col_A;

COL_A   TYPE1_COL_E  TYPE1  TYPE1_COUNT TYPE2_COL_E  TYPE2  TYPE2_COUNT
-----  -----------  ------- ----------- -----------  ------ -----------
Id_1     Flat         null      0        Not Flat      30        2
Id_2     Flat         35        1        Flat          35        1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...