2016-08-23 33 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

取代'SELECT * FROM occupations'使用'選擇* from(select *,row_number()over(按職業順序劃分(選擇null))職業)o'。你想分配一個row_number或類似的東西,使每一行不同。編輯:如果你不想讓行號顯示在最終結果集中,只需選擇特定的列。 – 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