Správné uložení prodejních dat a jejich pozdější zkombinování může vést k vytvoření prediktivního modelu s vysokou mírou přesnosti. V tomto a několika dalších článcích analyzujeme návrh databáze pro evidenci tržeb.
Každý žije tím, že něco prodává.
Robert Louis Stevenson
V dnešním světě prodej produktů je všudypřítomný. A prodejci, kteří mají přístup k robustním nástrojům, které využívají historická data k analýze trendů a umožňují podniku odpovídajícím způsobem upravit obchodní strategie, mají výhodu nad svými konkurenty. Existuje mnoho parametrů, které mohou ovlivnit výsledky společnosti:současná globální ekonomická situace, poloha klientů, věk, materiální a rodinný stav a historie předchozích kontaktů nebo prodejů klientům.
Začneme velmi jednoduchým příkladem:databázový model pro prodej v kavárně . V následujících článcích rozšíříme model na prodej produktů v dalších pobočkách.
Prodejní model
V tomto článku analyzujeme pouze část modelu, která obsahuje údaje o prodeji, přičemž ostatní části chybí.
Stále máme připojení k chybějícím tabulkám a budeme se na model dívat jako na černou skříňku za předpokladu, že následující je správné pro tabulku sale
:
user_has_role_id
viz id vuser_has_role
(jak je uvedeno v mém předchozím článku v sekci „Přidána časová složka“) a ukládá informace o uživateli, který vytvořil záznam prodeje
Tento model nám umožňuje vytvářet prodejní záznamy s více položkami. Každá položka se vztahuje k produktu z našeho katalogu. Okamžik, kdy generujeme prodej, se může lišit od okamžiku, kdy je prodej zaplacen. Například u šálku kávy se tyto okamžiky budou lišit v řádu minut nebo hodin. Pokud náš obchod prodával telekomunikační zařízení, rozdíl může být několik dní, možná i měsíců.
Tabulky
Pojďme se podívat na definici tabulky a vysvětlit účel a použití atributů.
Nejdůležitější tabulka v modelu je product
. Slouží k ukládání podrobností o produktech, které nabízíme našim klientům. Produkty jsou obvykle doručeny klientovi a zaplaceny jednorázově, obvykle v době dodání. Produkty jsou také obvykle fyzické předměty, jako jsou auta, telefony, balíčky cukru nebo šálky kávy.
O prodeji nefyzických věcí (služeb) si povíme v dalších článcích.
Atributy v product
tabulka jsou:
name
– název produktu v systémuprice_per_unit
– náklady na produkt na jednotku (např. 1 šálek kávy stojí 1,8 eura, 1 auto stojí 17 500 eur, 1 kg rýže stojí 2 eura)basic_unit
– základní jednotka, když produkt prodáváme (např. kus, kg, litr)tax_percentage
– procento z ceny za jednotku, které má být účtováno jako daň. Musíme předpokládat, že procento daně nebude pro všechny produkty stejnélimited
– toto pole je nastaveno na True, pokud máme na skladě omezené množství, a False v opačném případě (např. si můžeme u distributora objednat jakékoli množství, které potřebujeme pro náš obchod)in_stock
– if limited=True tento atribut ukazuje, kolik máme k dispozici k prodejiactive_for_sale
– pokud je tento atribut nepravdivý, pak daný produkt aktuálně nenabízíme k prodeji, jinak jej můžeme nabídnout klientům
Seznam produktů, které můžeme klientům nabídnout, můžeme získat následujícím dotazem:
SELECT product.id, product.price_per_unit, product.basic_unit, product.limited, product.in_stock FROM product WHERE product.active_for_sale = True AND (product.limited = False OR (product.limited = True and product.in_stock > 0))
Tabulka sale_status
je jen jednoduchý slovník, který obsahuje všechny stavy, které prodej může mít v systému (např. „účtenka vystavena“, „účtenka zaplacena“).
Tabulka
sale
je druhá nejdůležitější tabulka v tomto modelu. Tato tabulka zatím nemá žádnou souvislost s klienty, kterým jsme prodávali produkty, protože v našem příkladu kavárny takové informace znát nepotřebujeme. V části 2 bude model rozšířen o takové případy. Atributy v tabulce a jejich význam jsou:
time_created
– čas, kdy byl v systému vygenerován záznam o prodeji (např. automatický čas, kdy byl záznam vytvořen, když jsme vygenerovali prodej na kávu v naší kavárně, nebo ručně přidaný čas, pokud to chceme)time_paid
– obecně můžeme očekávat, že některé tržby budou vyplaceny během několika dnů nebo dokonce měsíce po vytvoření (např. pokud dodáme software a vytvoříme účtenku, můžeme v některých zemích čekat až 90 dní na platbu, pokud vše proběhne bez problémů zákon)sale_amount
– původní částka, která má být klientovi účtovánasale_amount_paid
– částka, kterou klient skutečně zaplatil. Může být nulový, protože v okamžiku, kdy vytváříme účtenku, tyto informace vždy nemámetax_amount
– součet všech částek daně za položky na této účtencesale_status_id
– odkaz nasale_status
stůluser_has_role_id
– odkaz na uživatele a jeho roli v okamžiku, kdy zadal účtenku do systému
Můžeme získat vystavenou a zaplacenou částku (podle time_created) během časového období pomocí dotazu, jako je tento:
SELECT SUM(sale.sale_amount) AS amount_issued, SUM(sale.sale_amount_paid) AS amount_paid FROM sale WHERE sale.time_created >= @start_time AND sale.time_created <= @end_time;
Abychom dostali přesnou částku zaplacenou v určitém časovém období, musíme použít dotaz jako tento:
SELECT SUM(sale.sale_amount_paid) AS amount_paid FROM sale WHERE sale.time_paid >= @start_time AND sale.time_paid <= @end_time;
Dotaz níže vypočítá vydanou a zaplacenou částku za určité časové období, přičemž datum vydání a datum platby budou zaškrtnuty samostatně:
SELECT SUM(CASE WHEN sale.time_created >= @start_time AND sale.time_created <= @end_time THEN sale.sale_amount END) AS amount_issued, SUM(CASE WHEN sale.time_paid >= @start_time AND sale.time_paid <= @end_time THEN sale.sale_amount_paid END) AS amount_paid FROM sale
Ve všech příkladech @start_time
a @end_time
jsou proměnné obsahující čas začátku a čas konce období, za které chceme zkontrolovat vydaný a zaplacený SUM.
Tabulka sale_item
spojuje produkty a prodej. Samozřejmě musíme předpokládat, že budeme mít více položek na jedné účtence, takže potřebujeme, aby tato tabulka měla vztah mnoho k mnoha.
Atributy a jejich význam jsou:
quantity_sold
– množství produktu, které bylo prodáno a je účtováno při tomto prodeji/účtence (např. 3 kávy)price_per_unit
– stejná hodnota jakoproduct.price_per_unit
v okamžiku vytvoření prodeje. Musíme to uložit, protožeprice_per_unit
vproduct
tabulka se může časem měnitprice
– produktquantity_sold
aprice_per_unit
; malá redundance, která nám pomáhá vyhnout se tomuto výpočtu v dotazech. Obecně platí, že součet cen všech položek patřících do stejné akce by se měl rovnat hodnotěsale.sale_amount
tax_amount
– částka daně pro danou položku při příjmusale_id
– ID prodeje, kterému tato položka patříproduct_id
– ID produktu související s touto položkou
Nyní jsme mohli snadno vytvořit jednoduchý přehled, kolik produktů/služeb jsme prodali za období a za jakou cenu.
SELECT product.name, SUM(sale_item.quantity_sold) AS quantity, SUM(sale_item.price) AS price FROM sale, sale_item, product WHERE sale.id = sale_item.sale_id AND sale_item.product_id = product.id AND sale.time_created >= @start_time AND sale.time_created <= @end_time GROUP BY product.id