SQL развернуть таблицу для объединения поданных с дубликатами данных - PullRequest
0 голосов
/ 04 мая 2020

У меня есть таблица с некоторыми дубликатами данных, я хочу объединить поле в одну таблицу.

Мои данные в настоящее время выглядят так:

name       job1        Unit1_Level1       Unit1__Level2
-------------------------------------------------------
A          Teacher     Infomation      Information_office
A          Staff       Secretary       Secretary_office
B          Teacher     Finacial        Finacial_office
C          Teacher     Engineer        Engineer_office
C          Staff       Library         Library_office
D          Staff       Library         Library_office    

И я хочу, чтобы они выглядели так:

name       job1        Unit1_Level1       Unit1__Level2       job2     Unit2_Level1     Unit2__Level2
------------------------------------------------------------------------------------------------------
A          Teacher     Infomation      Information_office     Staff    Secretary        Secretary_office
B          Teacher     Finacial        Finacial_office
C          Teacher     Engineer        Engineer_office        Staff    Library          Library_office
D          Staff       Library         Library_office    

Надеюсь, что кто-нибудь может мне помочь, спасибо!

Ответы [ 2 ]

0 голосов
/ 04 мая 2020

Вы можете использовать условное агрегирование:

select name,
       max(case when seqnum = 1 then job1 end) as job1_1,
       max(case when seqnum = 1 then Unit1_Level1 end) as Unit1_Level1_1,
       max(case when seqnum = 1 then Unit1_Level2 end) as Unit1_Level2_1,
       max(case when seqnum = 2 then job1 end) as job1_2,
       max(case when seqnum = 2 then Unit1_Level1 end) as Unit1_Level1_2,
       max(case when seqnum = 2 then Unit1_Level2 end) as Unit1_Level1_2
from (select t.*,
             row_number() over (partition by name order by job1 desc) as seqnum
      from t
     ) t
group by name
0 голосов
/ 04 мая 2020

Вы можете использовать функцию row_number () для нумерации каждой итерации (задания) одного и того же человека. С этим номером вы можете вернуть выбор их первой итерации и присоединиться к ним во второй итерации .... или даже присоединиться к третьей, четвертой, ... итерации.

with cte as (
  select name, job1, Unit1_Level1, Unit1_Level2,
         row_number() over (partition by name order by job1 desc) as iteration
  from MyTable
)
select i1.name, i1.job1, i1.Unit1_Level1, i1.Unit1_Level2,
       i2.job1 as job2, i2.Unit1_Level1 as Unit2_Level1, i2.Unit1_Level2 as Unit2_Level2,
       i3.job1 as job3, i3.Unit1_Level1 as Unit3_Level1, i3.Unit1_Level2 as Unit3_Level2
from cte as i1
     left join cte as i2 on i2.name = i1.name and i2.iteration = 2
     left join cte as i3 on i3.name = i1.name and i3.iteration = 3
where i1.iteration = 1

PS: У вас нет ' Я указал, в каком порядке вы хотите вернуть задания одного и того же человека, поэтому я использовал job1 des c, чтобы вернуть их в качестве образцов данных: первый учитель и второй персонал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...