2015-05-08 3 views
2

Вот мой текущий набор данных:Как повернуть второй столбец в TSQL

rname ename 
Advises Grad_student 
Advises Faculty 
Chairs Department 
Chairs Faculty 

Я пытаюсь получить его в следующем формате:

rname ename1  ename2 
advises grad_student faculty 
chairs department faculty 

Вот что я пытался до сих пор:

select distinct 
r1.rname, r1.ENAME as ename1,r2.ENAME as ename2 
from [dbo].[RELATIONSHIPS] r1 
inner join(
select distinct 
RNAME, ENAME 

from [dbo].[RELATIONSHIPS]) r2 
on r1.RNAME = r2.RNAME 
where r1.ENAME <> r2.ENAME 

order by r1.rname 

Вот что я получаю обратно:

rname ename1  ename2 
Advises Grad_student Faculty 
Advises Faculty  Grad_student 
Chairs Department Faculty 
Chairs Faculty  Department 

Как бы я исправить свой код, чтобы получить только 1 строку назад?

ответ

1

Вы можете использовать row_number() с conditional aggregation:

with cte as (
    select rname, ename, row_number() over (partition by rname order by ename) rn 
    from relationships 
) 
select rname, 
    max(case when rn = 1 then ename end) ename1, 
    max(case when rn = 2 then ename end) ename2 
from cte 
group by rname 
+0

Хорошо, что решает эту проблему, не видел КТР раньше. Благодаря! – user2146212

+0

@ user2146212 - np, ctes являются 'common-table-expressions' - несколько похожими на временные представления. Ключом к решению является использование 'row_number()' для создания группировки. – sgeddes

0

Если есть только когда-либо два, то просто сделать это таким образом. Короткие и сладкие.

SELECT rname, 
     MIN(ename) ename1, 
     MAX(ename) ename2 
FROM relationships 
GROUP BY rname 
1

В оракула

select * from 
(select rname,ename, 
RANK() over (partition by rname order by ename) Id 
FROM relationships) 
PIVOT(MAX(ename) for Id in (1 as ename1, 2 as ename2)) 
Смежные вопросы