Skip to content

Instantly share code, notes, and snippets.

@ihorkatkov
Last active July 4, 2016 06:55
Show Gist options
  • Save ihorkatkov/1548b505617fa9c500fc8fa6de519138 to your computer and use it in GitHub Desktop.
Save ihorkatkov/1548b505617fa9c500fc8fa6de519138 to your computer and use it in GitHub Desktop.
First task
a. Вернуть название фирмы и ее телефон. В результате должны быть представлены
все фирмы по одному разу. Если у фирмы нет телефона, нужно вернуть пробел или
прочерк. Если у фирмы несколько телефонов, нужно вернуть любой из них.
SELECT DISTINCT
name,
IFNULL(phone, " ") AS phone
FROM symfony.firms AS firms
LEFT JOIN symfony.phones AS phones ON firms.id = phones.firm_id
GROUP BY name;
b. Вернуть все фирмы, не имеющие телефонов.
SELECT name
FROM symfony.firms AS firms
LEFT JOIN symfony.phones AS phones ON firms.id = phones.firm_id
GROUP BY phones.id
HAVING count(phones.id) = 0;
c. Вернуть все фирмы, имеющие не менее 2-х телефонов.
SELECT name
FROM symfony.firms AS firms
LEFT JOIN symfony.phones AS phones ON firms.id = phones.firm_id
GROUP BY firm_id
HAVING count(*) >= 2;
d. Вернуть все фирмы, имеющие менее 2-х телефонов.
SELECT name
FROM symfony.firms AS firms
LEFT JOIN symfony.phones AS phones ON firms.id = phones.firm_id
GROUP BY firm_id
HAVING count(*) < 2;
e. Вернуть фирму, имеющую максимальное кол-во телефонов.
SELECT name
FROM symfony.firms
WHERE id IN (
SELECT firm_id
FROM
(
SELECT
firm_id,
count(*) AS counted
FROM symfony.phones AS phones
GROUP BY firm_id
ORDER BY counted DESC
LIMIT 1
) AS counts);
Second task
a. Вывести общий объем поставок каждого из продуктов для каждой фирмы с указанием
даты последней поставки
SELECT
company.name AS `company_name`,
goods.name AS `good_name`,
ifnull(t.sum, "No data") AS `sum`,
t.date AS `date`
FROM company
JOIN goods
LEFT JOIN (
SELECT
shipment.shipid,
compid,
goodid,
sum(shipment.quantity) AS `sum`,
max(shipdate) AS `date`
FROM shipment
GROUP BY shipment.goodid, shipment.compid
) AS t
ON company.compid = t.compid AND goods.goodid = t.goodid
b.Аналогично предыдущему пункту, но за последние 60 дней. Если поставки
какого-либо из товаров для компании в этот период отсутствовали, вывести в
столбце объема 'No data'
SELECT
company.name AS `company_name`,
goods.name AS `good_name`,
ifnull(t.sum, "No data") AS `sum`,
t.date AS `date`
FROM company
JOIN goods
LEFT JOIN (
SELECT
shipment.shipid,
compid,
goodid,
sum(shipment.quantity) AS `sum`,
max(shipdate) AS `date`
FROM shipment
WHERE
shipment.shipdate >= CURDATE() - INTERVAL 60 DAY AND
shipment.shipdate <= CURDATE()
GROUP BY shipment.goodid, shipment.compid
) AS t
ON company.compid = t.compid AND goods.goodid = t.goodid
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment