2016-08-23 3 views
1

Допустим, у меня есть эта таблица:Используя стержень в TSQL

Name  Occupation 
Samantha Doctor 
Julia  Actor 
Maria  Actor 
Meera  Singer 
Ashely  Professor 
Ketty  Professor 
Christeen Professor 
Jane  Actor 
Jenny  Doctor 
Priya  Singer 

Я хочу, чтобы этот вывод:

Doctor  Professor Singer Actor 
    Jenny  Ashley  Meera Jane 
    Samantha Christeen Priya Julia 
    NULL  Ketty  NULL  Maria 

Я хочу, чтобы преобразовать оккупационные строки в столбцы, а затем перечислить имена, занятие. Я пытался с pivot реляционным оператором, но первый аргумент, который мы передаем в pivot, должен быть агрегатной функцией, поэтому я не уверен, что это лучший способ решить этот запрос. Это вопрос, что я работаю с использованием pivot, но, конечно, как я использую max(name) это просто возвращается одно имя:

select * from occupations 
pivot (max(name) for occupation in ([doctor],[actor],[singer],[professor])) 
as pvt 

Это мой выход, используя приведенный выше запрос:

doctor  actor singer professor 
Samantha Maria Priya Ketty 

Могу ли я использовать операционный оператор pivot, чтобы решить эту проблему? Какие изменения я мог бы сделать?

+1

вместо 'выбрать * из occupations' использовать' выберите * from (select *, row_number() over (раздел по порядку заполнения по (выберите null)) rn из занятий) o'. вы хотите присвоить row_number или что-то подобное, чтобы каждая строка отличалась. edit: если вы не хотите, чтобы номер строки отображался в конечном наборе результатов, просто выберите определенные столбцы. – ZLK

ответ

1

Я склонен подойти к этим проблемам с помощью условной агрегации:

select max(case when occupation = 'Doctor' then Name end) as doctor, 
     max(case when occupation = 'Actor' then Name end) as actor, 
     max(case when occupation = 'Singer' then Name end) as singer, 
     max(case when occupation = 'Professor' then Name end) as professor  
from (select t.*, 
      row_number() over (partition by occupation order by name) as seqnum 
     from thistable t 
    ) t 
group by seqnum 
order by seqnum; 
1

Это SQL

with data as (
    select * from (values 
     ('Samantha', 'Doctor') 
     ,('Julia', 'Actor') 
     ,('Maria', 'Actor') 
     ,('Meera', 'Singer') 
     ,('Ashely', 'Professor') 
     ,('Ketty', 'Professor') 
     ,('Christeen','Professor') 
     ,('Jane',  'Actor') 
     ,('Jenny', 'Doctor') 
     ,('Priya', 'Singer') 
    )t(Name,Occupation) 
), 
groups as (
    select 
     Name,Occupation, 
     RowNo = row_number() over (partition by Occupation order by Name) 
    from data 
) 
select 
    Doctor,Professor,Singer,Actor 
from groups 
pivot (max(Name) for occupation in (Doctor,Professor, Singer,Actor)) as pvt 
; 

выходы:

Doctor Professor Singer Actor 
--------- --------- --------- --------- 
Jenny  Ashely Meera  Jane 
Samantha Christeen Priya  Julia 
NULL  Ketty  NULL  Maria 
Смежные вопросы