powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Сортировка NULL
12 сообщений из 12, страница 1 из 1
Сортировка NULL
    #40038353
vsg-good
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.

На курсе https://learndb.ru выполняю такую задачу:

Посчитай статистику по руководителям (employee.manager_id) в магазинах. Выведи следующие данные:
store_name - название магазина;
manager_full_name - имя и фамилия руководителя, разделенные пробелом;
amount_employees - количество человек в подчинении.
Если в магазине есть сотрудники, у которых нет руководителя (manager_id is null), в результате должна быть строка, в которой manager_full_name принимает значение NULL, а amount_employees равно количеству сотрудников без руководителя в магазине.
Отсортируй результат по названию магазина, затем по manager_full_name.

Построил запрос:
SELECT s.name as store_name, concat(e1.first_name, ' ', e1.last_name) as manager_full_name, count(e.employee_id) as amount_employees
FROM store s
JOIN employee e
ON e.store_id = s.store_id
LEFT JOIN employee e1
ON e1.employee_id = e.manager_id
GROUP BY store_name, manager_full_name
ORDER BY store_name, manager_full_name

Мой результат совпадает с ожидаемым, но при сортировке по возрастанию manager_full_name, которое получаю конкатенацией имени и фамилии, NULL значения идут вначале (что логично), а должны идти в конце (согласно курсу). Подскажите пожалуйста где сделал ошибку. Делать по убыванию DESC нет смысла, так как хотя NULL уходит вниз, manager_full_name должны идти по возрастанию.
...
Рейтинг: 0 / 0
Сортировка NULL
    #40038377
Павел Лузанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vsg-good,

В order by можно указать что делать с null значениями. Посмотрите в документации .
...
Рейтинг: 0 / 0
Сортировка NULL
    #40038823
vsg-good
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не подходит. В условии четко прописано что сортировать можно только по названию магазина, затем по manager_full_name.
...
Рейтинг: 0 / 0
Сортировка NULL
    #40038828
Павел Лузанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vsg-good
Не подходит. В условии четко прописано что сортировать можно только по названию магазина, затем по manager_full_name.

А что именно не подходит? Покажите что пробовали.
...
Рейтинг: 0 / 0
Сортировка NULL
    #40038833
vsg-good
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Задача описана в первом сообщении. Запрос указан там же. Единственное, count(e.employee_id) надо заменить на count(*).

Получается выборка (взял для примера один магазин) типа:
store_name manager_full_name amount_employees
Big 1
Big Ольга Вершинина 1
Big Павел Авдеев 3

А должно быть:
store_name manager_full_name amount_employees
Big Ольга Вершинина 1
Big Павел Авдеев 3
Big NULL 1

То есть у меня стоит пусто, а должно быть NULL. Плюс это пустое значение стоит вверху, а должно быть внизу. Проблема все же не в сортировке, а в том что у меня пустое значение, а не NULL. Когда я связываю таблицу с ней самой по id сотрудника-id менеджера, то имя-фамилия при отсутствующем значении id менеджера логично не подтягивается, но выдает не NULL значение, а пустое.

P.S. Сотрудник считается руководителем для другого сотрудника, если его код сотрудника (employee_id) равен коду руководителя (manager_id) соответствующих сотрудников.
...
Рейтинг: 0 / 0
Сортировка NULL
    #40038854
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vsg-good
А должно быть:
store_name manager_full_name amount_employees
Big Ольга Вершинина 1
Big Павел Авдеев 3
Big NULL 1


Код: sql
1.
ORDER BY store_name, case when manager_full_name is null then 1 else 0 end, manager_full_name
...
Рейтинг: 0 / 0
Сортировка NULL
    #40038876
vsg-good
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пишет: column "manager_full_name" does not exist.

Когда меняю manager_full_name на конкатенацию из верха запроса, запрос срабатывает, но дает тот же результат что был. Думаю, что все же неправильно сравнивать manager_full_name с null, так как запрос в принципе не присваивает ему null значение. То есть или имя-фамилия, или пусто.
...
Рейтинг: 0 / 0
Сортировка NULL
    #40038915
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vsg-good
Пишет: column "manager_full_name" does not exist.

Когда меняю manager_full_name на конкатенацию из верха запроса, запрос срабатывает, но дает тот же результат что был. Думаю, что все же неправильно сравнивать manager_full_name с null, так как запрос в принципе не присваивает ему null значение. То есть или имя-фамилия, или пусто.
так проверяй "пусто"
Код: sql
1.
ORDER BY store_name, case when concat(e1.first_name, ' ', e1.last_name) = '' then 1 else 0 end, manager_full_name
...
Рейтинг: 0 / 0
Сортировка NULL
    #40038922
vsg-good
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это решило проблему сортировки - пустые значения ушли вниз под имена-фамилии. Но осталась вторая проблема - по-прежнему показываются пустые значения, а должны NULL.
...
Рейтинг: 0 / 0
Сортировка NULL
    #40038932
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vsg-good
Это решило проблему сортировки - пустые значения ушли вниз под имена-фамилии. Но осталась вторая проблема - по-прежнему показываются пустые значения, а должны NULL.
гугли nullif
...
Рейтинг: 0 / 0
Сортировка NULL
    #40038935
vsg-good
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Nullif помог, спасибо!
...
Рейтинг: 0 / 0
Сортировка NULL
    #40038952
Павел Лузанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vsg-good,

Если правильно понял, то в первом запросе достаточно заменить выражение concat(e1.first_name, ' ', e1.last_name) на выражение e1.first_name || ' ' || e1.last_name. И всё станет сортироваться как нужно.

Функция concat возвращает пробел даже если первый и третий аргументы NULL, а конкатенация через || вернет NULL если хотя бы одно из значений NULL.
Код: sql
1.
2.
3.
4.
select concat(null, ' ', null) is null, null || ' ' || null is null;
 ?column? | ?column? 
----------+----------
 f        | t
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Сортировка NULL
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]