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;
nazevprumer
Turbo Karts5.0
Knight's Oath4.5
Moon Farm4.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ísto strftime() 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 jako better-sqlite3 nebo pg pro 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í!

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:

jmenoutraceno
Eva Novotná5224
Tereza Svobodová3924
Jakub Dvořák3896
Lukáš Procházka3894
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:

jmenoutracenoprani
Eva Novotná52242
Tereza Svobodová39241
Jakub Dvořák38962
Lukáš Procházka38940
Tomáš Veselý24971

Začněte programovat zdarma

Registrací souhlasíte s provozními podmínkami a zásadami ochrany osobních údajů.

Nebo se registrujte pomocí:

6/6