У меня есть вопрос о применении функции агрегирования, которая использовалась в сводной функции.
Таблица OCCUPATIONS выглядит следующим образом:
+-----------+------------+
| Name | Occupation |
+-----------+------------+
| Ashley | Professor |
| Samantha | Actor |
| Julia | Doctor |
| Britney | Professor |
| Maria | Professor |
| Meera | Professor |
| Priya | Doctor |
| Priyanka | Professor |
| Jennifer | Actor |
| Ketty | Actor |
| Belvet | Professor |
| Naomi | Professor |
| Jane | Singer |
| Jenny | Singer |
| Kristeen | Singer |
| Christeen | Singer |
| Eve | Actor |
| Aamina | Doctor |
+-----------+------------+
Первый столбец - имя, а второй -занятие.Теперь я хочу создать сводную таблицу, в которой каждый столбец представляет собой один вид занятия, а имя отсортировано в алфавитном порядке, и выведите NULL, когда больше нет имен для занятия.
Вывод должен выглядеть следующим образом:
+--------+-----------+-----------+----------+
| Doctor | Professor | Singer | Actor |
+--------+-----------+-----------+----------+
| Aamina | Ashley | Christeen | Eve |
| Julia | Belvet | Jane | Jennifer |
| Priya | Britney | Jenny | Ketty |
| NULL | Maria | Kristeen | Samantha |
| NULL | Meera | NULL | NULL |
| NULL | Naomi | NULL | NULL |
| NULL | Priyanka | NULL | NULL |
+--------+-----------+-----------+----------+
Здесь первая колонка «Доктор», вторая - «Профессор», третья - «Сингер» и четвертая - «Актер».Код для генерации результата:
select [Doctor],[Professor],[Singer],[Actor] from (select o.Name,
o.Occupation, row_number() over(partition by o.Occupation order by
o.Name) id from OCCUPATIONS o) as src
pivot
(max(src.Name)
for src.Occupation in ([Doctor],[Professor],[Singer],[Actor])
) as m
Но когда я заменяю сгенерированную здесь таблицу:
(select o.Name, o.Occupation, row_number() over(partition by o.Occupation order by o.Name) id from OCCUPATIONS o) as src' to 'OCCUPATIONS'
результат выглядит так:
Priya Priyanka Kristeen Samantha
Iпонять, почему это происходит, потому что мы берем MAX()
в каждой группе.Тем не менее, в предыдущем результате я также использую функцию MAX()
для генерации NULL
, когда больше не будет названий, оно не возвращает максимальное значение, как ожидалось, вместо этого оно возвращает каждое имя.
Мой вопрос, почему это происходит?
Спасибо!