|
1 | | -### |
| 1 | +### Профессии - [Occupations] |
2 | 2 |
|
3 | 3 | <img src="./art/23.png" alt="solution" > |
4 | 4 |
|
5 | 5 | #### eng: |
| 6 | +Pivot the Occupation column in OCCUPATIONS so that each Name is sorted alphabetically and displayed underneath its |
| 7 | +corresponding Occupation. The output column headers should be Doctor, Professor, Singer, and Actor, respectively. |
6 | 8 |
|
| 9 | +Note: Print NULL when there are no more names corresponding to an occupation. |
| 10 | + |
| 11 | +Input Format |
| 12 | + |
| 13 | +The OCCUPATIONS table is described as follows: |
| 14 | +Occupation will only contain one of the following values: Doctor, Professor, Singer or Actor. |
7 | 15 |
|
8 | 16 |
|
9 | 17 | #### рус: |
| 18 | +Поверните столбец «Профессия» в «ОККУПАЦИИ», чтобы каждое имя было отсортировано в |
| 19 | +алфавитном порядке и отображалось под соответствующей профессией. |
| 20 | +Заголовки выходных столбцов должны быть «Доктор», «Профессор», «Певец» и «Актер» |
| 21 | +соответственно. |
| 22 | + |
| 23 | +Примечание. Выведите NULL, если больше нет имен, соответствующих роду занятий. |
10 | 24 |
|
| 25 | +Формат ввода |
| 26 | + |
| 27 | +Таблица OCCUPATIONS описывается следующим образом: |
| 28 | +Род занятий будет содержать только одно из следующих значений: Доктор, Профессор, Певец |
| 29 | +или Актер. |
11 | 30 |
|
12 | 31 |
|
13 | 32 | #### код с коментариями: |
14 | 33 | ```sql |
15 | | - |
| 34 | +-- Итак нам нужно будет создать таблицу из 4-х столбцов доктор, профессор, певец, |
| 35 | +-- обобщенное табличное выражение |
| 36 | +WITH temp AS ( /* создать временную таблицу */ |
| 37 | +SELECT /* выбрать данные */ |
| 38 | + CASE /* в случае */ |
| 39 | + WHEN occupation='doctor' THEN name /* когда занятие доктор имя внести в столбец доктор */ |
| 40 | + END AS doctor, |
| 41 | + CASE /* в случае */ |
| 42 | + WHEN occupation='professor' THEN name /* когда занятие профессор имя внести в столбец профессор */ |
| 43 | + END AS professor, |
| 44 | + CASE /* в случае */ |
| 45 | + WHEN occupation='singer' THEN name /* когда занятие певец имя внести в столбец певец */ |
| 46 | + END AS singer, |
| 47 | + CASE /* в случае */ |
| 48 | + WHEN occupation='actor' THEN name /* когда занятие актер имя внести в столбец актер */ |
| 49 | + END AS actor, |
| 50 | + row_number() over /* нумерует строки, возвращаемые запросом */ |
| 51 | + (partition by occupation /* разделить по занятию */ |
| 52 | + ORDER BY name) as ran /* отсортировать по имени */ |
| 53 | +FROM occupations) /* из таблицы занятие */ |
| 54 | +SELECT /* выбрать данные */ |
| 55 | + min(doctor), /* выбрать минимальные данные столбца */ |
| 56 | + min(professor), /* выбрать минимальные данные столбца */ |
| 57 | + min(singer), /* выбрать минимальные данные столбца */ |
| 58 | + min(actor) /* выбрать минимальные данные столбца */ |
| 59 | +FROM temp /* из временной таблицы */ |
| 60 | +GROUP BY ran /* сгруппировать по столбцу номер по порядку */ |
16 | 61 | ``` |
17 | 62 |
|
18 | 63 | #### код для hackerrank: |
19 | 64 | ```sql |
20 | | - |
| 65 | +WITH temp AS ( |
| 66 | +SELECT |
| 67 | + CASE |
| 68 | + WHEN occupation='doctor' THEN name |
| 69 | + END AS doctor, |
| 70 | + CASE |
| 71 | + WHEN occupation='professor' THEN name |
| 72 | + END AS professor, |
| 73 | + CASE |
| 74 | + WHEN occupation='singer' THEN name |
| 75 | + END AS singer, |
| 76 | + CASE |
| 77 | + WHEN occupation='actor' THEN name |
| 78 | + END AS actor, |
| 79 | + row_number() over (partition by occupation ORDER BY name) as ran |
| 80 | +FROM occupations) |
| 81 | +SELECT |
| 82 | + min(doctor), |
| 83 | + min(professor), |
| 84 | + min(singer), |
| 85 | + min(actor) |
| 86 | +FROM temp |
| 87 | +GROUP BY ran |
21 | 88 | ``` |
22 | 89 |
|
23 | 90 |
|
|
0 commit comments