Базы данных
и язык SQL

Функция COALESCE в более сложных запросах

Связанные темы
Назад<<<СодержаниеВперёд>>>

Как и рассмотренный на странице 1 пример 4 применения функции COALESCE, следующие примеры иллюстрируют, как эта функция помогает избегать неопределенности в вычислениях.

Продолжаем работать с базой данных "Театр", о содержании которой на странице 1.

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

Пример 5. Вывести список актеров с их стажем, количеством ролей и количеством ролей в качестве дублера (использовать CURRENT DATE, GROUP BY)

SELECT DISTINCT a.Actor_ID ,a.FName ,a.LName, (SELECT CURRENT DATE - p1.PremiereDate FROM Play p1 JOIN Team t1 ON p1.play_id = t1.play_id JOIN Actor a1 ON t1.actor_id = a1.actor_id WHERE a1.Actor_ID = a.Actor_ID ORDER BY p1.PremiereDate DESC FETCH FIRST 1 ROWS ONLY) AS ExpDays, (SELECT COUNT(*) FROM Actor a1 JOIN Team t1 ON a1.Actor_ID = t1.Actor_ID WHERE a1.Actor_ID = a.Actor_ID GROUP BY a1.Actor_ID) AS NumRoles, COALESCE((SELECT COUNT(*) FROM Actor a1 JOIN Team t1 ON a1.Actor_ID = t1.Actor_ID WHERE a1.Actor_ID = a.Actor_ID AND t1.MainTeam = 'N' GROUP BY a1.Actor_ID), 0) AS NumSecRoles FROM Actor a JOIN Team t ON a.actor_id = t.actor_id JOIN Play p ON t.play_id = p.play_id ORDER BY a.Actor_ID

Пример 6. Определить актеров, у которых меньше 50 процентов основных ролей

SELECT DISTINCT a.Actor_ID ,a.FName ,a.LName FROM Actor a JOIN Team t ON a.actor_id = t.actor_id JOIN Play p ON t.play_id = p.play_id WHERE (COALESCE(( SELECT COUNT(*) FROM Actor a1 JOIN Team t1 ON a1.Actor_ID = t1.Actor_ID WHERE a1.Actor_ID = a.Actor_ID AND t1.MainTeam = 'N' GROUP BY a1.Actor_ID ), 0) / ( SELECT COUNT(*) FROM Actor a1 JOIN Team t1 ON a1.Actor_ID = t1.Actor_ID WHERE a1.Actor_ID = a.Actor_ID GROUP BY a1.Actor_ID )) > 0.5 ORDER BY a.Actor_ID

Поделиться с друзьями

Назад<<<СодержаниеВперёд>>>