Nejlepší zákazníci
Poslední otázka: kdo jsou nejlepší zákazníci obchodu? Obchod jim chce poděkovat dárkem a dárek chce vybrat z jejich seznamu přání. Potřebuje tedy zákazníky, kteří v zaplacených objednávkách utratili nejvíc, a kolik her má každý z nich v seznamu přání.
Sčítat hodnoty jedné tabulky a počítat řádky jiné v jednom dotazu je past. Kdybyste k tabulkám objednavky a polozky připojili seznam_prani, každá položka by se zopakovala pro každé přání zákazníka a SUM by ji tolikrát i sečetl. Proto nejdřív spočítejte útraty samostatně a teprve pak přidejte zbytek. Přesně k tomu slouží WITH: dá výsledku dotazu jméno a hlavní dotaz ho použije jako tabulku. Například nejlépe hodnocené hry:
WITH hodnoceni AS (
SELECT hra_id, AVG(hvezdicky) AS prumer
FROM recenze
GROUP BY hra_id
)
SELECT h.nazev, ROUND(ho.prumer, 1) AS prumer
FROM hodnoceni AS ho
JOIN hry AS h ON h.id = ho.hra_id
ORDER BY ho.prumer DESC, h.nazev
LIMIT 3;| nazev | prumer |
|---|---|
| Turbo Karts | 5.0 |
| Knight's Oath | 4.5 |
| Moon Farm | 4.5 |
Počet přání může dát korelovaný poddotaz v SELECT, který spočítá řádky zákazníka v tabulce seznam_prani, nebo LEFT JOIN s COUNT(sp.hra_id). Tak či tak musí zákazník s prázdným seznamem přání ve výsledku zůstat s nulou, takže obyčejný JOIN se seznamem přání nestačí.
Až tento dotaz napíšete, bude projekt hotový a s ním i celý kurz. Gratulujeme! Od svého prvního SELECT * FROM hry; jste ušli dlouhou cestu: jen v tomto projektu jste navrhli tabulku, naplnili ji a odpověděli na otázky obchodu pomocí spojování tabulek, seskupování, poddotazů a WITH. Přesně takové SQL používají programátoři, analytici a datoví vědci každý den.
Kam dál? Pár tipů:
- Procvičujte na vlastních datech. SQLite je zdarma a běží na každém počítači. V bezplatném programu DB Browser for SQLite si vytvoříte databázi, naimportujete do ní tabulku uloženou jako CSV a můžete se jí ptát na cokoli, co vás zajímá.
- Jiné databáze. Co jste se naučili, funguje i v PostgreSQL, MySQL a SQL Serveru, jen s drobnými rozdíly: jiné typy (
VARCHAR,DATE,BOOLEAN), jiné funkce pro datum a čas místostrftime()a jinak zapsaná automatická ID. Skvělým dalším krokem je PostgreSQL. - Okenní funkce (
OVER,ROW_NUMBER,RANK). Počítají přes více řádků, aniž by je seskupily, například pořadí každého zákazníka nebo průběžný součet tržeb. - SQL ve vašich programech. Aplikace posílají SQL své databázi z kódu: v Pythonu modulem
sqlite3, v JavaScriptu knihovnou jakobetter-sqlite3nebopgpro PostgreSQL. Hodnoty od uživatelů se předávají jako parametry a nikdy se nevkládají přímo do textu SQL – to databázi chrání před útokem zvaným SQL injection.
Hodně štěstí a ať vás dotazy baví!
Jak psát:
Pokyny
Pod komentář -- 6. Nejlepší zákazníci napište dotaz, který začíná WITH: výsledek s názvem utraty se sloupci zakaznik_id a utraceno (součet počtu krát cena ze zaplacených objednávek zákazníka). Hlavní dotaz ho spojí s tabulkou zakaznici a ukáže pět nejlepších zákazníků: sloupce jmeno a utraceno, seřazené od nejvyšší útraty, a zákazníky se stejnou útratou podle jména:
| jmeno | utraceno |
|---|---|
| Eva Novotná | 5224 |
| Tereza Svobodová | 3924 |
| Jakub Dvořák | 3896 |
| Lukáš Procházka | 3894 |
| Tomáš Veselý | 2497 |
Přidejte třetí sloupec, prani: počet her, které má zákazník v seznamu přání. Zákazník s prázdným seznamem dostane nulu:
| jmeno | utraceno | prani |
|---|---|---|
| Eva Novotná | 5224 | 2 |
| Tereza Svobodová | 3924 | 1 |
| Jakub Dvořák | 3896 | 2 |
| Lukáš Procházka | 3894 | 0 |
| Tomáš Veselý | 2497 | 1 |
Začněte programovat zdarma
6/6