SQL Сервер, поворачивающий запрос - PullRequest
0 голосов
/ 06 апреля 2020

Я использую SQL Сервер и пытаюсь составить список имен по роду занятий, может кто-нибудь помочь мне понять, почему ниже не будет работать? Вот оригинальный источник вопроса: https://www.hackerrank.com/challenges/occupations/problem?h_r=next-challenge&h_v=zen&h_r=next-challenge&h_v=zen

select *
from (select Name, Occupation from OCCUPATIONS)
PIVOT(Name for Occupation in ([Doctor],[Professor],[Singer],[Actor])) as pivot_table;

Ответы [ 2 ]

0 голосов
/ 07 апреля 2020

Вы должны написать свой столбец в select и использовать агрегатную функцию как count в вашем запросе.

select 'count' as name_count, 
    [Doctor],
    [Professor],
    [Singer],
    [Actor] 
from (select Name, Occupation from OCCUPATIONS) as s_t
PIVOT(Count(Name) for Occupation in ([Doctor],[Professor],[Singer],[Actor])) as pivot_table;
0 голосов
/ 06 апреля 2020

Я бы использовал row_number() для ранжирования имен для каждой профессии, а затем условное агрегирование для поворота набора данных:

select
    max(case when occupation = 'Doctor' then name end) doctor,
    max(case when occupation = 'Professor' then name end) professor,
    max(case when occupation = 'Singer' then name end) singer,
    max(case when occupation = 'Actor' then name end) actor
from (
    select o.*, row_number() over(partition by occupation order by name) rn
    from occupations o
) t
group by rn

Демонстрация на DB Fiddle

Пример данных:

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    | Ashely    | Meera  | Jane 
Samantha | Christeen | Priya  | Julia
<em>null</em>     | Ketty     | <em>null</em>   | Maria
...