SQL GROUP BY HAVING и агрегирующие функции COUNT, SUM, AVG, MIN, MAX. Практика SQL

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

Умение сгрупировать данные и отфильтровать собранную группу позволяет получать больше возможностей чем используя лишь JOIN. Из этого урока вы поймете как пользоваться инструкциями GROUP BY и HAVING, а также изучите функции COUNT, SUM, AVG, MAX, MIN

Повторяйте за мной набор запросов, и результат не заставит себя долго ждать, вы прокачаете свои навыки, и обязательно делайте ДЗ.

Отнеситесь серьезно к домашнему заданию, жду комментов под видео

---- Соц сети
Телеграм, где можно узнать о новых видео и получать доп контент
P.S. В youtube я отвечаю быстрее чем в telegram, буду рад комментам в youtube

----
Чтобы поддержать канал
1) Можно поставить лайк (или дизлайк, если не понравилось видео)
2) Оставить комментарий более 5 слов (можно решенное ДЗ)
3) Досмотреть видео до конца (так удержание будет выше и мне это поможет в продвижении)
4) Оставить отзыв в комментариях, что можно улучшить в видео, чтобы не хотелось его закрывать

#sql #grommax

Материально поддержать канал можно следующим способом
2) Пройти опрос, чтобы помочь выбрать подходящие варианты поддержки

Оглавление
00:00 - Введение
00:24 - COUNT(*) в SQL
01:00 - SUM в SQL
01:34 - AVG в SQL
02:00 - MIN / MAX в SQL
02:40 - Агрегирующие операции это
03:38 - GROUP BY в SQL
06:12 - HAVING в SQL
06:56 - Практика
10:28 - GROUP BY по двум колонкам
11:58 - Домашнее задание
Рекомендации по теме
Комментарии
Автор

ДЗ 📖:
1) Хочу знать сколько заработал наш сайт за все время жизни
2) Хочу знать сколько заработал каждый сотрудник нашему сайту
3) Хочу знать какой сотрудник оформил заказы дороже 10000
4) Хочу знать какой сотрудник и сколько заказов оформил дороже 1000
5) Хочу знать товары какого поставщика были проданы в наибольшем количестве
6) Хочу знать топ 3 поставщика чьи товары принесли наибольшее количество денег

ВНИМАНИЕ!!! ДЗ можно прикрепить под моим комментом или с дополнительным текстом, а не только лишь запросами. Youtube удаляет чисто запросы без текста и не дает мне возможности разрешить их к публикации. Если будут проблемы, то пишите, будем думать как обходить блокировки youtube

grommaks
Автор

Разъяснение.

5:21
В OrderID 10248 позиций-3:
10248 - 252
10248 - 140
10248 - 174.
Group BY объединил номера 3 строк в одну, но числа из трех строк не объединили, а взяли первое попавшееся, то есть 252.

в 5:35 c коммандой SUM он складывает 252+140+174, и тогда все становится ровно - 3 штуки Order ID 10248 объединяются в одну, числа 252 и 140 и 174 суммируются в одно - 566.

mrbombastic
Автор

Предположим, после left outer join получается такая таблица:

1 отец автомобиль
1 отец мотоцикл
1 отец куртка
2 мать автомобиль
2 мать сумка
3 дочь платье
4 сын Null

Как можно сгруппировать по человеку и посчитать только транспортные средства для каждого? Чтобы получилось:

1 отец 2
2 мать 1
3 дочь 0
4 сын 0

georgiyveter
Автор

У меня вопрос. Зачем мы суммируем Quantity в этом запросе:

SELECT CustomerID, ProductID, sum(Quantity) FROM OrderDetails OD
JOIN Orders O ON O.OrderID = OD.OrderID
Group by CustomerID, ProductID

Если можно убрать функцию SUM и оставить в Select'e Quantity. Т.к. мы Группируем по CustomerID и ProductID то они автоматически суммировались. Вот если бы мы не группировали, то наверное SUm была бы полезна. Или я ошибаюсь?

Void-wsjz
Автор

5:39 в предведущем видео ты говорил что не можно делать виборку полей и агрегаты в одном запросе ? (о_О)

kurnatvasyl
Автор

Привет, спасибо за урок

1) SELECT SUM(OD.Quantity*P.Price) as Total
FROM OrderDetails OD
JOIN Products P ON P.ProductID = OD.ProductID

2) SELECT E.EmployeeID, E.FirstName, E.LastName, SUM(OD.Quantity*P.Price) as Total
FROM OrderDetails OD
JOIN Products P ON P.ProductID = OD.ProductID
JOIN Orders O on O.OrderID = OD.OrderID
JOIN Employees E on E.EmployeeID = O.EmployeeID
GROUP BY E.EmployeeID
ORDER BY Total DESC

3) здесь я сгрупировал все заказы и вывел те что дороже 10 000
SELECT E.EmployeeID, E.FirstName, O.OrderID, SUM(OD.Quantity*P.Price) as Total
FROM OrderDetails OD
JOIN Products P ON P.ProductID = OD.ProductID
JOIN Orders O on O.OrderID = OD.OrderID
JOIN Employees E on E.EmployeeID = O.EmployeeID
GROUP BY OD.OrderID
HAVING Total > 10000
ORDER BY O.OrderID

4 select EmployeeID, count(EmployeeID) as OrdersQuantity from
(SELECT E.EmployeeID, OD.OrderID, SUM(Quantity*Price) as Total FROM OrderDetails OD
join Orders O on O.OrderID = OD.OrderID
join Employees E on E.EmployeeID = O.EmployeeID
join Products P on P.ProductID = OD.ProductID
group by O.OrderID
having Total > 1000
)
group by EmployeeID
order by OrdersQuantity desc


5) SELECT S.SupplierID, SUM(OD.Quantity) as Total
FROM OrderDetails OD
JOIN Products P on P.ProductID = OD.ProductID
JOIN Suppliers S on S.SupplierID = P.SupplierID
GROUP BY S.SupplierID
ORDER BY Total DESC
limit 1


6) SSELECT S.SupplierID, SUM(Quantity*Price) as total FROM OrderDetails OD
join Products P on P.ProductID = OD.ProductID
join Suppliers S on S.SupplierID = P.SupplierID
group by S.SupplierID
order by total desc
limit 3

rtujkop
Автор

ОТвет на задание №4:
SELECT O.OrderID, E.EmployeeID, SUM(Quantity*Price) AS Total FROM OrderDetails OD
JOIN Orders O ON O.OrderID = OD.OrderID
JOIN Products P ON P.ProductID = OD.ProductID
JOIN Employees E ON E.EmployeeID = O.EmployeeID
GROUP BY O.OrderID
HAVING Total > 1000
ORDER BY E.EmployeeID

nurdinaidaraliev
Автор

Ответ на задание №5:
SELECT S.SupplierID, S.SupplierName, SUM(OD.Quantity) FROM Suppliers S
JOIN Products P ON P.SupplierID = S.SupplierID
JOIN OrderDetails OD ON OD.ProductID = P.ProductID
GROUP BY S.SupplierName
ORDER BY SupplierName

nurdinaidaraliev
Автор

Вот дз к уроку:
1) SELECT OD.ProductID, OD.Quantity, P.Price, SUM(Price * Quantity) AS Total FROM OrderDetails OD
JOIN Products P ON P.ProductID = OD.ProductID

2) SELECT SUM(Quantity * Price) AS Total, E.EmployeeID, LastName FROM Employees E
JOIN Orders O ON O.EmployeeID = E.EmployeeID
JOIN OrderDetails OD ON O.OrderID = Od.OrderID
JOIN Products P ON P.ProductID = OD.ProductID
GROUP BY E.EmployeeID
ORDER BY Total DESC

3) SELECT E.EmployeeID, SUM(Quantity * Price) AS Total FROM OrderDetails OD
JOIN Products P ON OD.ProductID = P.ProductID
JOIN Orders O ON OD.OrderID = O.OrderID
JOIN Employees E ON O.EmployeeID = E.EmployeeID
GROUP BY OD.OrderID
HAVING Total > 10000
ORDER BY Total DESC

4) SELECT O.OrderID, E.EmployeeID, SUM(Price * Quantity) AS Cost FROM OrderDetails OD
JOIN Orders O ON O.OrderID = OD.OrderID
JOIN Products P ON OD.ProductID = P.ProductID
JOIN Employees E ON O.EmployeeID = E.EmployeeID
GROUP BY O.OrderID
HAVING Cost > 1000
ORDER BY E.EmployeeID

5) SELECT P.ProductID, P.SupplierID, S.SupplierName, P.ProductName, SUM(Quantity) AS Cost FROM Products P
JOIN OrderDetails OD ON P.ProductID = OD.ProductID
JOIN Suppliers S ON P.SupplierID = S.SupplierID
GROUP BY P.SupplierID
ORDER BY Cost DESC
LIMIT 1 OFFSET 0

6) SELECT S.SupplierID, S.SupplierName, SUM(Price * Quantity) AS Cost FROM Suppliers S
JOIN Products P ON P.SupplierID = S.SupplierID
JOIN OrderDetails OD ON P.ProductID = OD.ProductID
GROUP BY S.SupplierID
ORDER BY Cost DESC
LIMIT 3

Правда я очень сомневаюсь, что запросы правильные =)

narezkedx
Автор

Как всегда надеюсь, что я правильно уловил посыл и все выполнил))
Пожалуйста, дайте знать где и что не так.
ДЗ:
1) SELECT sum(Quantity*Price) as Total FROM OrderDetails OD
JOIN Orders O ON O.OrderID = OD.OrderID
JOIN Products P ON P.ProductID = OD.productID



2)SELECT SUM(Quantity) as Quantity, SUM(Price) as Total, E.EmployeeID, LastName, FirstName FROM Employees E
JOIN Orders O ON E.EmployeeID = O.EmployeeID
JOIN OrderDetails OD ON O.OrderID = OD.OrderID
JOIN Products P ON P.ProductID = OD.ProductID
Group by E.EmployeeID

3) Если здесь не ошибка и имеется ввиду правда Заказы дороже 10.000 Тот Нет заказов дороже 10.000.

4) SELECT SUM(Quantity) as Quantity, SUM(Price) as Total, E.EmployeeID, LastName, FirstName FROM Employees E
JOIN Orders O ON E.EmployeeID = O.EmployeeID
JOIN OrderDetails OD ON O.OrderID = OD.OrderID
JOIN Products P ON P.ProductID = OD.ProductID
Group by E.EmployeeID
Having Total > 1000

5)SELECT S.SupplierID, S.SupplierName, SUM(Quantity) as Quantity FROM OrderDetails OD
JOIN Products P ON P.ProductID = OD.ProductID
JOIN Suppliers S ON S.SupplierID = P.SupplierID
Group by S.SupplierID
order by Quantity DESC
LIMIT 1

6)SELECT S.SupplierID, S.SupplierName, P.ProductID, SUM(Price) as Total FROM OrderDetails OD
JOIN Products P ON P.ProductID = OD.ProductID
JOIN Suppliers S ON S.SupplierID = P.SupplierID
Group by S.SupplierID
order by Total DESC
LIMIT 3

Void-wsjz
Автор

Подскажите плиз, правильно ли я решил 4й пример?
SELECT E.EmployeeID, LastName, SUM(Quantity*Price) AS Made, SUM(Quantity) AS AllOrders FROM Employees E
JOIN Orders O ON O.EmployeeID = E.EmployeeID
JOIN OrderDetails OD ON OD.OrderID = O.OrderID
JOIN Products P ON P.ProductID = OD.ProductID
GROUP BY E.EmployeeID
HAVING Made > 1000

llERAZER
Автор

Ответ на задание №6:
SELECT S.SupplierID, S.SupplierName, SUM(Quantity*Price) AS Total FROM OrderDetails OD
JOIN Orders O ON O.OrderID = OD.OrderID
JOIN Products P ON P.ProductID = OD.ProductID
JOIN Suppliers S ON S.SupplierID = P.SupplierID
GROUP BY S.SupplierID, S.SupplierName
ORDER BY Total DESC

nurdinaidaraliev