Запрос SQL Server, направленный на «поворот» таблицы, содержащей нечисловые данные - PullRequest
0 голосов
/ 24 января 2019

Название таблицы: Профессии

**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" и другого запроса с помощью команды sql server "pivot" )

1 Ответ

0 голосов
/ 24 января 2019

Я бы не использовал pivot для этого. Условное агрегирование проще написать и понять. Это также почти всегда немного лучше для производительности.

Сначала я должен превратить эти данные во что-то расходуемое. Вот как вы должны публиковать такую ​​информацию в будущем.

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
...