TGViewer
LEFT JOIN LEFT JOIN @leftjoin · 41.8K subscribers
Post #747 11.9K
🤔 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(), и 🤯, если впервые о нем слышите!
Smallthingssql HAVING, a less understood SQL clause Understanding how the group by and having clauses work can help us write more efficient sql. I want to demonstrate this with an example…
  • 🤯 141
  • ⚡ 34
  • 👍 17
  • ❤ 5
  • 🤔 1
More from @leftjoin
  1. Oct 14, 2026Claude помог обнаружить новую планету Наверное. Пользователь reddit проанализировал данные…
  2. Oct 12, 20264 уровня ИИ-осведомленности Еще в апреле Андрей Карпаты (автор термина «вайбкодинг», если…
  3. Oct 9, 2026Anthropic представила Claude Dashboards и Claude Motion И вот опять ИИ отбирает работу у а…
  4. Oct 7, 2026Состоялся релиз Polars 2.0 Polars — Python-библиотека для работы с данными и популярная ал…
  5. Oct 5, 2026Physical AI: следующий этап развития ИИ Рано или поздно ИИ выйдет за пределы интернета в р…
  6. Sep 30, 2026Что было на OpenAI Dev Day? Вообще-то много чего — больше 20 релизов и анонсов. Пройдемся…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →