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_idviz 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“).
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_statusstů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_unitv okamžiku vytvoření prodeje. Musíme to uložit, protožeprice_per_unitvproducttabulka se může časem měnitprice– produktquantity_soldaprice_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_amounttax_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