表名称:职业
**Name Occupation**
Samantha Doctor
Julia Actor
Maria Actor
Meera Singer
Ashely Professor
Ketty Professor
Christeen Professor
Jane Actor
Jenny Doctor
Priya Singer
目标是编写一个查询,该查询将“透视”上述表数据,以便显示以下结果:
Jenny Ashley Meera Jane
Samantha Christeen Priya Julia
NULL Ketty NULL Maria
我写了以下查询:
WITH pivot_data AS
(
SELECT Occupation as Occupation1, -- Grouping Column
Occupation, -- Spreading Column
Name -- Aggregate Column
FROM Occupations
)
SELECT [Doctor], [Professor], [Singer], [Actor]
FROM pivot_data
PIVOT (max(Name)
FOR Occupation IN ([Doctor], [Professor], [Singer], [Actor])
) AS p;
不幸的是,上述查询给出了以下错误结果:
Doctor Professor Singer Actor
NULL NULL NULL Maria
Samantha NULL NULL NULL
NULL Ketty NULL NULL
NULL NULL Priya NULL
有人可以发布将显示所需结果的sql查询吗?(此外,如果您可以使用sql server“ pivot”命令执行一个查询,而另一个使用Out sql server“ pivot”命令进行查询,这将非常有帮助。 )
答案 0 :(得分:2)
我不会为此使用数据透视。条件聚合更容易编写和理解。它的性能几乎总是略胜一筹。
首先,我必须将数据转换为可消耗的东西。这是您以后应该发布此类信息的方式。
declare @Something table
(
Name varchar(20)
, Occupation varchar(20)
)
insert @Something values
('Samantha', 'Doctor')
, ('Julia', 'Actor')
, ('Maria', 'Actor')
, ('Meera', 'Singer')
, ('Ashely', 'Professor')
, ('Ketty', 'Professor')
, ('Christeen', 'Professor')
, ('Jane', 'Actor')
, ('Jenny', 'Doctor')
, ('Priya', 'Singer')
;
现在,我们可以使用此数据轻松地生成您的输出。
with NumberedRows as
(
select *
, RowNum = ROW_NUMBER() over(partition by Occupation order by name)
from @Something
)
select Doctor = max(case when nr.Occupation = 'Doctor' then nr.Name end)
, Professor = max(case when nr.Occupation = 'Professor' then nr.Name end)
, Singer = max(case when nr.Occupation = 'Singer' then nr.Name end)
, Actor = max(case when nr.Occupation = 'Actor' then nr.Name end)
from NumberedRows nr
group by nr.RowNum