如何在sql server中使用pivot(没有聚合)?

Roh*_*han 5 sql database sql-server

请帮我解决这个问题:给你一个表,包含两列:列是以下之一:

Doctor
Professor
Singer
Actor
Run Code Online (Sandbox Code Playgroud)

编写查询以输出相应occ下面的名称.采用以下格式:

+--------+-----------+--------+------+

| Doctor | Professor | Singer | Actor|

+--------+-----------+--------+------+
Run Code Online (Sandbox Code Playgroud)

名称必须按字母顺序排列.

样本输入

Name        Occupation
Meera       Singer
Ashely      Professor
Ketty       Professor
Christeen   Professor
Jane        Actor
Jenny       Doctor
Priya       Singer    
Run Code Online (Sandbox Code Playgroud)

样本输出

Jenny    Ashley     Meera  Jane

Samantha Christeen  Priya  Julia

NULL     Ketty      NULL   Maria
Run Code Online (Sandbox Code Playgroud)

注意

当没有更多名称对应于职业时,打印"NULL".

我试过用:

SELECT *
FROM
(
SELECT [Name], [Occupation] 
FROM occupations 
) AS source
PIVOT
(
    max([Name])
    FOR [occupation] IN ([Doctor], [Professor], [Singer], [Actor]) 
) as pvt;
Run Code Online (Sandbox Code Playgroud)

它给出了以下输出:

Priya Priyanka Kristeen Samantha 
Run Code Online (Sandbox Code Playgroud)

怎么解决?

Jam*_*D77 14

您只需要根据字体的职业和顺序为每个名称添加一个行号.然后在您的数据透视查询中包含该行号.

CREATE TABLE Occupations (
     NAME VARCHAR(MAX),
     Occupation VARCHAR(MAX)
    )
INSERT  INTO Occupations
VALUES
        ('Samantha','Doctor'),
        ('Julia','Actor'),
        ('Maria','Actor'),
        ('Meera','Singer'),
        ('Ashley','Professor'),
        ('Ketty','Professor'),
        ('Christeen','Professor'),
        ('Jane','Actor'),
        ('Jenny','Doctor'),
        ('Priya','Singer');

SELECT
    [Doctor],
    [Professor],
    [Singer],
    [Actor]
FROM
    (SELECT 
         ROW_NUMBER() OVER (PARTITION BY Occupation ORDER BY Name) rn,
         [Name],
         [Occupation] 
     FROM 
         Occupations
    ) AS source 
PIVOT
    ( MAX([Name]) FOR [occupation] IN ([Doctor],[Professor],[Singer],[Actor]) ) as pvt
ORDER BY rn


DROP TABLE Occupations
Run Code Online (Sandbox Code Playgroud)


小智 6

我在Oracle 中尝试过,似乎更容易理解:

SELECT min(Doctor), min(Professor), min(Singer), min(Actor)
FROM
( Select
ROW_NUMBER() OVER (PARTITION BY Occupation order by Name) rn, 
CASE 
WHEN Occupation = 'Doctor' then Name
end as Doctor,
CASE 
WHEN Occupation = 'Professor' then Name
end as Professor,
CASE 
WHEN Occupation = 'Singer' then Name
end as Singer,
CASE 
WHEN Occupation = 'Actor' then Name
end as Actor
from OCCUPATIONS
order by Name) a
group by rn
order by rn;
Run Code Online (Sandbox Code Playgroud)