Към съдържанието
wannacode

Пекарната, етап 3: въпросите

Накратко: Третият етап отговаря на въпросите на пекарната с JOIN, GROUP BY, LEFT JOIN, WITH и COALESCE: менюто, сметките, най-продаваното и приходите по град.

Проблем

Какво искат да знаят

Пекарната има данни. Сега иска отговори: какво да напише в менюто, колко е платил всеки клиент, кое да пече повече, на кого да прати отстъпка, кои поръчки са големи и откъде идват парите.

Всеки въпрос е една заявка към базата от етап 2. Нищо не се записва: базата е същата след всяка заявка.

Идеята

Евтините неща

Най-простият въпрос е към една таблица: продуктите под 2 €, от най-евтиния нагоре.

SQLпразна база

Пробвай

Менюто

Направи менюто: категорията (колона category), името и цената на всеки продукт. Подреди го по категории в реда на номерата им (хляб, сладкиши, напитки), а в категорията от най-евтиния продукт.

SQLпразна база

Идеята

Сметката

Всеки ред от поръчката струва quantity * unit_price. Поръчка 5 на Десислава:

SQLпразна база

Сумата на поръчката е сборът на тези редове: SUM(quantity * unit_price) с GROUP BY по поръчка.

Пробвай

Сметките на всички

За всяка поръчка, която не е отказана: номер, името на клиента, датата и сумата (колона total, закръглена до 2 знака). Подреди по номер.

SQLпразна база
По-точно, за любопитните

GROUP BY o.id, а в SELECT са c.name и o.ordered_at, които не са в групата. SQLite го позволява. PostgreSQL приема o.ordered_at, защото първичният ключ на orders е в групата, но не и c.name, която е от друга таблица. Там се пише GROUP BY o.id, c.name, и така заявката работи навсякъде.

Пробвай

Кое да пече повече

Трите най-продавани продукта по бройки, без отказаните поръчки: името и броят (колона pieces), от най-продавания. При равни бройки по име.

SQLпразна база

Идеята

Кой не е поръчвал

LEFT JOIN пази всеки клиент, дори без поръчка. Там колоните на поръчката са NULL, и WHERE o.id IS NULL оставя точно тях:

SQLпразна база

Пробвай

Отстъпка за новите

Пекарната праща отстъпка на всички, които нямат нито една истинска поръчка: без поръчки или само с отказани. Покажи имената им по азбучен ред.

SQLпразна база

Пробвай

Големите поръчки

Кои поръчки (без отказаните) са над средната сума на поръчка? Номер и сума (total, закръглена до 2 знака), по номер. Направи сумите с WITH totals AS (…).

SQLпразна база

Упражнение

Откъде идват парите

Приходите по град от поръчките, които не са отказани, за всички градове на клиентите. Град без приходи е с 0, а клиентите без град са под 'без град'. Колони city и revenue (закръглена до 2 знака), от най-големия приход.

SQLпразна база
По-точно, за любопитните

SUM върху група само с NULL дава NULL, не 0. Затова е COALESCE(SUM(…), 0). Сумата на поръчка е десетична, затова е ROUND: 0.1 + 0.2 в REAL не е точно 0.3.

Идеята

Какво следва

Всички тези заявки само четат. Следващият етап сменя данните: цени, статуси, наличности, изтрити поръчки.

Тест

Провери се

1. Защо в сметката на поръчката се събира quantity * unit_price, а не price от products?
2. LEFT JOIN orders o ON o.customer_id = c.id и после WHERE o.status <> 'cancelled'. Какво става с клиентите без поръчки?
3. Средното на поръчка е 9.40 €. Защо не се пише WHERE total > 9.4?

Създаден от Иво Гергов като част от кампанията на Evo Tech за достъпно обучение по програмиране ·