Присоединение выберите в одной строке для одного и того же результата - PullRequest
0 голосов
/ 28 апреля 2019

У меня есть следующий результат запроса (я сохранил этот результат в таблице #TMP)

Id  |  Letter  |  Column1  |  Column2
1   |  A       |  400      |  200
1   |  A       |  101      |  201
1   |  A       |  102      |  203
2   |  A       |  100      |  200
2   |  A       |  700      |  201
2   |  A       |  102      |  202

Я хочу сделать выбор в этой таблице #TMP, но теперь мне нужен выводкак это:

Id  |  Letter  |  Alias1  |  Alias2  | Alias1-1  |  Alias2-1 |  Alias1-2  | Alias2-2
1   |  A       |  400     |  200     | 101       |  201      |  102       | 203  
2   |  A       |  100     |  200     | 700       |  201      |  102       | 202  

Как я могу это сделать?Я пытался выполнить объединение, но получаю много одинаковых результатов.

select A.Id, A.Letter, B.Column1, B.Column2
from #TMP A
inner join #TMP B ON A.Id = B.Id AND A.Letter = B.Letter

Я также пытался создать группу по

select Id, Letter, Column1, Column2
from #TMP
group by Id

Но в этом запросе запрашивается буква column1,столбец 2 будет добавлен в группу по синтаксису, и если я это сделаю, то получу тот же результат, что и команда select * from # TMP

PD: таблица #TMP всегда должна содержать 3 одинаковых идентификатора, строки букв

PD2: значение Column1 может быть больше, чем значение Column2 в одной строке, а в следующей строке column2 может быть больше, чем column1 для результатов с тем же Id.

1 Ответ

4 голосов
/ 29 апреля 2019

Вы можете использовать row_number() оконную функцию вместе с conditional aggregation

with t(Id,Letter,Column1,Column2) as
(
    select 1,'A',100,200 union all
    select 1,'A',101,201 union all 
    select 1,'A',102,203 union all
    select 2,'A',100,200 union all
    select 2,'A',101,201 union all
    select 2,'A',102,202
), t2 as
(
select
    *,
    row_number() over (partition by Id,Letter order by Column1) as rn
  from [t]
)    
select Id,Letter,
       max(case when rn = 1 then Column1 end ) as [Alias1],
       max(case when rn = 2 then Column1 end ) as [Alias2],
       max(case when rn = 3 then Column1 end ) as [Alias1-1],
       max(case when rn = 1 then Column2 end ) as [Alias2-0],
       max(case when rn = 2 then Column2 end ) as [Alias2-1],
       max(case when rn = 3 then Column2 end ) as [Alias2-2] 
  from t2
 group by Id,Letter 

Демо

...