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