операция транспонирования таблицы кустов с использованием sql - PullRequest
0 голосов
/ 09 мая 2018

Я хочу переставить таблицу с помощью куста QL Это таблица соусов ниже

___________________________________________
subject|roll_1|roll_2|roll_3|roll_4|roll_5|
___________________________________________
MATHS  |80    | 90   |   78 |   95 |    68|
___________________________________________
ENGLISH|78    | 78   | 67   |75    |54    |

и я хочу получить ответ в формате, показанном в таблице ниже

subject|MATHS|ENGLISH|
______________________
roll_1 |80   |78     |
______________________
roll_2 |90   |78     |
______________________
roll_3 |78   | 67    |
______________________
roll_4 |95   |75     |
______________________
roll_5 |68   |54     |

, пожалуйста, помогите мне восстановить это

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Это самое близкое, что я могу сделать, чтобы сделать его родовым, так как добавляются новые столбцы, вам нужно только внести изменения в CONCAT () внутри карта ()

select pos1+1 AS rollnum,mat,eng from(
  select collect_list(a.group_map['MATHS']) as MATHS,
         collect_list(a.group_map['ENGLISH']) as ENGLISH,
         from ( select map(SUBJECT,CONCAT(ROLL1,',',ROLL2,',',ROLL3,',',ROLL4,',',
                                                   ROLL5,',',ROLL6)) as group_map
                                                    from db_name.tbl_name) a) b
         lateral view posexplode(split(b.MATHS[0],',')) MATHS AS pos1,mat
         lateral view posexplode(split(b.ENGLISH[0],',')) ENGLISH AS pos2,eng

         WHERE pos1=pos2 

Хотя это может несколько повлиять на эффективность.

0 голосов
/ 09 мая 2018

Ниже приведен SQL для получения желаемого результата.

select 'roll_1' as subject,sum(case when subject='MATHS' then roll_1 else 0 end) maths,sum(case when subject='ENGLISH' then roll_1 else 0 end) english from your_table_2
union all
select 'roll_2' as subject,sum(case when subject='MATHS' then roll_2 else 0 end) maths,sum(case when subject='ENGLISH' then roll_2 else 0 end) english from your_table_2
union all
select 'roll_3' as subject,sum(case when subject='MATHS' then roll_3 else 0 end) maths,sum(case when subject='ENGLISH' then roll_3 else 0 end) english from your_table_2
union all
select 'roll_4' as subject,sum(case when subject='MATHS' then roll_4 else 0 end) maths,sum(case when subject='ENGLISH' then roll_4 else 0 end) english from your_table_2
union all
select 'roll_5' as subject,sum(case when subject='MATHS' then roll_5 else 0 end) maths,sum(case when subject='ENGLISH' then roll_5 else 0 end) english from your_table_2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...