sql >> Databáze >  >> RDS >> Database

Modelování databáze pro evidenci tržeb. Část 1

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 v user_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ému
  • price_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 prodeji
  • active_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ána
  • sale_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áme
  • tax_amount – součet všech částek daně za položky na této účtence
  • sale_status_id – odkaz na sale_status stůl
  • user_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 jako product.price_per_unit v okamžiku vytvoření prodeje. Musíme to uložit, protože price_per_unit v product tabulka se může časem měnit
  • price – produkt quantity_sold a price_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říjmu
  • sale_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


  1. Základy tabulkových výrazů, 2. část – Odvozené tabulky, logické úvahy

  2. Chyba PHP (MySQL):Upozornění:mysql_num_rows() očekává, že parametr 1 bude zdrojem

  3. Importujte více souborů CSV na SQL Server ze složky

  4. Síťová rozhraní SQL Server:Připojovací řetězec není platný [87]