🤔 HAVING — редкий вид, хватай, а то убежит
Пришла пора вспомнить, что этот телеграм-канал называется LEFT JOIN, а значит советы по улучшению навыков в SQL – наш основной профиль!
❗️Вы наверняка знаете, но
Понимание того, как работают предложения GROUP BY и HAVING, может помочь в написании качественных SQL-запросов. Я нашел короткую заметку, которая подробно разбирает реальный пример и ппоказывает преимущества использования этих операторов.
💭 РазбираемсяДано:
Предположим, у нас есть две таблицы: таблица с кодом страны и её названием и таблица счета-фактуры с номером счета-фактуры, кодом страны, годом, месяцем, количеством товаров и суммой.
Вопрос:
Хочется получить в результате таблицу, в которой будут ежегодные суммы для каждой страны и года, для каждой страны (все это, например, без США, см. исходную заметку), для каждого года и общую сумму по всем странам.
Какое-то решение:
Можно написать несколько запросов, а затем объединить их командой UNION, но решение получится медленным и неэффективным. Можно ли решить эту задачу лучше?
Элегантное решение:
Мы можем написать более простой и эффективный запрос, если чуть лучше поймем как работать с GROUP BY и HAVING. Точно так же, как предложение WHERE позволяет нам фильтровать необработанные данные, HAVING позволяет нам фильтровать набор результатов из GROUP BY.
Еще, можно использовать GROUP BY CUBE() для создания агрегатов для всех комбинаций страны и года, отфильтровывая сводные строки для США с HAVING.
🔗 Что делает GROUP BY CUBE()?
Упрощает вам жизнь.
А если серьезно, то он помогает получить по одной строке для каждой комбинации страны и года, по одной строке для каждой страны (включая данные за все года), по одной строке на каждый год (включая данные по всем странам) и последнюю строку для всех лет и стран.
Затем мы исключаем строки по США, с помощью предложения HAVING. В этом конкретном примере нужно было исключить данные по США только в двух из четырех агрегированных групп. Если бы требовалось исключить данные для США во всех сводных строках, стоило использовать предложение WHERE для фильтрации данных по США до того, как произойдет какое-либо агрегирование.
Если вы хотите по-настоящему раз и навсегда разобраться с этими предложениями, то прочтите заметку (там есть выкладки всех запросов и таблиц, чтобы прогнать код у себя) и больше никогда не путайтесь в их применении.
Оставляйте реакции ⚡️, если знали про GROUP BY CUBE(), и 🤯, если впервые о нем слышите!