Функция 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
Поделиться с друзьями