Skip to content

Instantly share code, notes, and snippets.

@n-bar
Last active March 19, 2019 08:01
Show Gist options
  • Save n-bar/a2ee4a4d164f58317e56 to your computer and use it in GitHub Desktop.
Save n-bar/a2ee4a4d164f58317e56 to your computer and use it in GitHub Desktop.
Specialist. SQL Level 2
--1. Задачи на операции с одной таблицей (без джойнов и подзапросов):
--a) В каких категориях имеется несколько товаров от одного и того же поставщика?
SELECT CategoryID
FROM Products
GROUP BY CategoryID, SupplierID
HAVING Count(ProductID) > 1;
--b) Сколько было куплено штук товара, принесшего компании максимальную выручку?
SELECT TOP 1 sum(Quantity) sumQuantity
FROM [Order Details]
GROUP BY ProductID
ORDER BY sum(Quantity * UnitPrice) DESC;
--c) В какие месяцы один и тот же покупатель обслуживался у разных продавцов?
SELECT CustomerID, MONTH(OrderDate) Month
FROM Orders
GROUP BY CustomerID, MONTH(OrderDate)
HAVING Count(DISTINCT EmployeeID) > 1
ORDER BY CustomerID, Month;
/*
2. Задачи на подзапросы и джойны (каждую нужно решить двумя способами – подзапросами и джойнами):
a) Какие товары (названия) продавались по цене, отличающейся от текущей?
Текущая цена указана в Products.UnitPrice?
Цена продажи указана в [Orders Details].UnityPrice?
Надо ли учитывать скидку?
*/
--JOIN
SELECT DISTINCT P.ProductName
FROM Products P INNER JOIN [Order Details] OD
ON P.ProductID = OD.ProductID
AND P.UnitPrice != OD.UnitPrice;
--WHERE
SELECT DISTINCT P.ProductName
FROM Products P, [Order Details] OD
WHERE P.ProductID = OD.ProductID
AND OD.UnitPrice != P.UnitPrice;
--Подзапрос в столбце
SELECT
(
SELECT DISTINCT P.ProductName
FROM [Order Details] OD
WHERE OD.ProductID = P.ProductID
AND OD.UnitPrice != P.UnitPrice
) ProductName
FROM Products P;
--Подзапрос в WHERE
SELECT P.ProductName
FROM Products P
WHERE P.ProductID = (
SELECT DISTINCT OD.ProductID
FROM [Order Details] OD
WHERE OD.ProductID = P.ProductID
AND OD.UnitPrice != P.UnitPrice
);
/*
2. Задачи на подзапросы и джойны (каждую нужно решить двумя способами – подзапросами и джойнами):
b) Как зовут покупателей, которые потратили в 1997 году меньше 1000 рублей?
*/
--JOIN
SELECT C.CustomerID, C.ContactName
FROM Customers C LEFT JOIN Orders O
ON C.CustomerID = O.CustomerID
AND Year(OrderDate) = 1997
LEFT JOIN [Order Details] OD
ON O.OrderID = OD.OrderID
GROUP BY C.CustomerID, C.ContactName --C.ContactName is not unique
HAVING COALESCE(sum(OD.UnitPrice * OD.Quantity), 0) < 1000;
--Подзапрос в WHERE
SELECT C.CustomerID, C.ContactName
FROM Customers C
WHERE (
SELECT COALESCE(sum(OD.UnitPrice * OD.Quantity), 0)
FROM [Order Details] OD, Orders O
WHERE C.CustomerID = O.CustomerID
AND O.OrderID = OD.OrderID
AND Year(O.OrderDate) = 1997
) < 1000;
/*
2. Задачи на подзапросы и джойны (каждую нужно решить двумя способами – подзапросами и джойнами):
c) Как зовут покупателей, которые потратили в 1997 году меньше 1000 рублей на морепродукты (товарная категория Seafood)?
*/
--JOIN
SELECT C.CustomerID, C.ContactName
FROM [Order Details] OD INNER JOIN Products P
ON OD.ProductID = P.ProductID
INNER JOIN Categories Cat
ON P.CategoryID = Cat.CategoryID
AND Cat.CategoryName = 'Seafood'
INNER JOIN Orders O
ON O.OrderID = OD.OrderID
AND Year(O.OrderDate) = 1997
RIGHT JOIN Customers C
ON O.CustomerID = C.CustomerID
GROUP BY C.CustomerID, C.ContactName--C.ContactName is not unique
HAVING COALESCE(sum(OD.UnitPrice * OD.Quantity), 0) < 1000;
--Подзапрос в WHERE
SELECT C.CustomerID, C.ContactName
FROM Customers C
WHERE (
SELECT COALESCE(sum(OD.UnitPrice * OD.Quantity), 0)
FROM [Order Details] OD, Orders O, Products P, Categories Cat
WHERE C.CustomerID = O.CustomerID
AND O.OrderID = OD.OrderID
AND Year(O.OrderDate) = 1997
AND OD.ProductID = P.ProductID
AND P.CategoryID = Cat.CategoryID
AND Cat.CategoryName = 'Seafood'
) < 1000;
@n-bar
Copy link
Author

n-bar commented Oct 6, 2015

Northwind (Упрощенная)

sql_2

@Piro18
Copy link

Piro18 commented Mar 19, 2019

Привет! а есть обучающая видюха?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment