Właściwe przechowywanie danych sprzedażowych i późniejsze ich łączenie może prowadzić do stworzenia modelu predykcyjnego o wysokim stopniu dokładności. W tym i kilku następnych artykułach przeanalizujemy projekt bazy danych do rejestrowania sprzedaży.
Każdy żyje ze sprzedaży czegoś.
Robert Louis Stevenson
W dzisiejszym świecie sprzedawanie produktów jest wszechobecne. Sprzedawcy, którzy mają dostęp do niezawodnych narzędzi, które wykorzystują dane historyczne do analizowania trendów i umożliwiają przedsiębiorstwu odpowiednie dostosowywanie strategii biznesowych, mają przewagę nad konkurencją. Istnieje wiele parametrów, które mogą wpływać na wyniki firmy:aktualna globalna sytuacja ekonomiczna, lokalizacja klientów, wiek, stan majątkowy i cywilny oraz historia poprzednich kontaktów lub sprzedaży do klientów.
Zaczniemy od bardzo prostego przykładu:model bazy danych do sprzedaży w kawiarni . W kolejnych artykułach rozszerzymy model o sprzedaż produktów w innych branżach.
Model sprzedaży
W tym artykule przeanalizujemy tylko część modelu, która zawiera dane sprzedaży z brakującymi innymi częściami.
Nadal mamy powiązania z brakującymi tabelami i przyjrzymy się modelowi jako czarnej skrzynce, zakładając, że poniższe informacje są poprawne dla tabeli sale :
user_has_role_idodnieś się do identyfikatora wuser_has_role(jak przedstawiono w moim poprzednim artykule w sekcji „Dodano składnik czasu”) i przechowuje informacje o użytkowniku, który utworzył rekord sprzedaży
Model ten umożliwia nam tworzenie rekordów sprzedaży z wieloma pozycjami. Każda pozycja jest powiązana z produktem z naszego katalogu. Moment, w którym generujemy sprzedaż, może być inny niż moment, w którym sprzedaż jest opłacana. Na przykład dla filiżanki kawy te chwile będą się różnić w ciągu minut lub godzin. Jeśli nasz sklep sprzedawał urządzenia telekomunikacyjne, różnica może wynosić kilka dni, może nawet miesięcy.
Stoły
Przyjrzyjmy się definicji tabeli i wyjaśnijmy cel i użycie atrybutów.
Najważniejszą tabelą w modelu jest product . Służy do przechowywania informacji o produktach, które będziemy oferować naszym klientom. Produkty są zazwyczaj dostarczane do klienta i opłacane jednorazowo, zazwyczaj w momencie dostawy. Ponadto produkty to zwykle przedmioty fizyczne, takie jak samochody, telefony, opakowania cukru lub filiżanki kawy.
W następnych artykułach porozmawiamy o sprzedaży niefizycznych rzeczy (usług).
Atrybuty w product tabela to:
name– nazwa produktu w systemieprice_per_unit– koszt produktu na sztukę (np. 1 filiżanka kawy kosztuje 1,8 euro, 1 samochód kosztuje 17 500 euro, 1 kg ryżu kosztuje 2 euro)basic_unit– jednostka bazowa przy sprzedaży produktu (np. sztuka, kg, litr)tax_percentage– procent ceny za jednostkę, który ma zostać naliczony jako podatek. Musimy założyć, że procent podatku nie byłby taki sam dla wszystkich produktówlimited– to pole jest ustawione na True, jeśli mamy ograniczoną ilość na magazynie, a False w przeciwnym razie (np. możemy zamówić dowolną ilość potrzebną do naszego sklepu u dystrybutora)in_stock– if limited=True ten atrybut pokazuje, ile mamy do sprzedaniaactive_for_sale– jeśli ten atrybut jest False, to obecnie nie oferujemy tego produktu do sprzedaży, w przeciwnym razie możemy zaoferować go klientom
Listę produktów, które możemy zaoferować klientom, możemy uzyskać za pomocą następującego zapytania:
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))
Tabela sale_status to po prostu prosty słownik, który zawiera wszystkie statusy, jakie sprzedaż może mieć w systemie (np. „paragon wydany”, „paragon zapłacony”).
sale to drugi najważniejszy stół w tym modelu. Do tej pory ta tabela nie ma żadnego związku z klientami, którym sprzedawaliśmy produkty, ponieważ w naszym przykładzie kawiarni nie musimy znać takich informacji. W części 2 model zostanie rozszerzony o takie przypadki. Atrybuty w tabeli i ich znaczenie to:
time_created– czas wygenerowania rekordu sprzedaży w systemie (np. automatyczny czas utworzenia rekordu, kiedy wygenerowaliśmy sprzedaż kawy w naszej kawiarni lub ręcznie dodany czas, jeśli sobie tego życzymy)time_paid– generalnie możemy spodziewać się, że część sprzedaży zostanie opłacona w ciągu kilku dni lub nawet miesiąca po utworzeniu (np. jeśli dostarczymy oprogramowanie i stworzymy paragon, w niektórych krajach możemy poczekać do 90 dni na zapłatę, jeśli wszystko minie prawo)sale_amount– pierwotna kwota przeznaczona do obciążenia klientasale_amount_paid– kwota, którą klient faktycznie zapłacił. Może być null, ponieważ w chwili, gdy tworzymy rachunek, nie zawsze mamy te informacjetax_amount– suma wszystkich kwot podatku za pozycje na tym paragoniesale_status_id– odniesienie dosale_statusstółuser_has_role_id– odniesienie do użytkownika i jego roli w momencie wprowadzenia paragonu do systemu
Wystawioną i opłaconą kwotę (zgodnie z time_created) możemy uzyskać w określonym czasie za pomocą zapytania:
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;
Aby otrzymać dokładną kwotę zapłaconą w określonym czasie, musimy użyć zapytania takiego:
SELECT SUM(sale.sale_amount_paid) AS amount_paid FROM sale WHERE sale.time_paid >= @start_time AND sale.time_paid <= @end_time;
Poniższe zapytanie obliczy wydaną i zapłaconą kwotę w okresie czasu, przy czym data wydania i data płatności są sprawdzane osobno:
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
We wszystkich przykładach @start_time i @end_time to zmienne zawierające czas rozpoczęcia i czas zakończenia okresu, dla którego chcemy sprawdzić wydaną i opłaconą sumę.
Tabela sale_item łączy produkty i sprzedaż. Oczywiście musimy założyć, że będziemy mieć wiele przedmiotów na jednym paragonie, więc potrzebujemy, aby ta tabela była w relacji wiele do wielu.
Atrybuty i ich znaczenie to:
quantity_sold– ilość sprzedanego produktu i naliczona przy tej sprzedaży/paragonie (np. 3 kawy)price_per_unit– taka sama wartość jakproduct.price_per_unitw momencie utworzenia sprzedaży. Musimy to zapisać, ponieważprice_per_unitwproductstół może się zmieniać w czasieprice– produktquantity_soldiprice_per_unit; mała redundancja, która pomaga nam uniknąć tego obliczenia w zapytaniach. Ogólnie suma wszystkich cen towarów należących do tej samej sprzedaży powinna być równasale.sale_amounttax_amount– kwota podatku za tę pozycję na paragoniesale_id– identyfikator sprzedaży, do której należy ten przedmiotproduct_id– identyfikator produktu powiązany z tym produktem
Moglibyśmy teraz łatwo sporządzić prosty raport, ile produktów/usług sprzedaliśmy w danym okresie i za jaką cenę.
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