Die richtige Speicherung von Verkaufsdaten und deren spätere Kombination kann zur Erstellung eines Vorhersagemodells mit hoher Genauigkeit führen. In diesem und den nächsten Artikeln analysieren wir ein Datenbankdesign zur Erfassung von Verkäufen.
Jeder lebt davon, etwas zu verkaufen.
Robert Louis Stevenson
In der heutigen Welt Produkte verkaufen ist allgegenwärtig. Und Vertriebsmitarbeiter, die Zugang zu robusten Tools haben, die historische Daten nutzen, um Trends zu analysieren und es einem Unternehmen ermöglichen, Geschäftsstrategien entsprechend anzupassen, haben einen Vorteil gegenüber ihren Konkurrenten. Es gibt viele Parameter, die sich auf die Unternehmensergebnisse auswirken können:die aktuelle globale Wirtschaftslage, der Standort der Kunden, das Alter, der materielle und Familienstand und die Geschichte früherer Kontakte oder Verkäufe an Kunden.
Wir beginnen mit einem sehr einfachen Beispiel:einem Datenbankmodell für Verkäufe in einem Café . In nachfolgenden Artikeln erweitern wir das Modell auf den Verkauf von Produkten in anderen Branchen.
Verkaufsmodell
In diesem Artikel analysieren wir nur einen Teil des Modells, der Verkaufsdaten enthält, während andere Teile fehlen.
Wir haben immer noch Verbindungen zu fehlenden Tabellen und betrachten das Modell als Blackbox, wobei wir davon ausgehen, dass Folgendes für die Tabelle sale
:
user_has_role_id
beziehen Sie sich auf die ID inuser_has_role
(wie in meinem vorherigen Artikel im Abschnitt „Zeitkomponente hinzugefügt“) und speichert Informationen über den Benutzer, der den Verkaufsdatensatz erstellt hat
Dieses Modell ermöglicht es uns, Verkaufsaufzeichnungen mit mehreren Artikeln zu erstellen. Jeder Artikel bezieht sich auf ein Produkt aus unserem Katalog. Der Moment, in dem wir einen Verkauf generieren, kann sich von dem Moment unterscheiden, in dem der Verkauf bezahlt wird. Bei einer Tasse Kaffee zum Beispiel unterscheiden sich diese Momente innerhalb von Minuten oder Stunden. Wenn unser Shop Telekommunikationsgeräte verkauft hat, kann der Unterschied einige Tage, vielleicht sogar Monate betragen.
Tabellen
Werfen wir einen Blick auf die Tabellendefinition und erläutern den Zweck und die Verwendung von Attributen.
Die wichtigste Tabelle im Modell ist product
. Es wird verwendet, um Details zu Produkten zu speichern, die wir unseren Kunden anbieten. Produkte werden normalerweise an einen Kunden geliefert und einmalig bezahlt, normalerweise zum Zeitpunkt der Lieferung. Außerdem sind Produkte in der Regel physische Objekte wie Autos, Telefone, Zuckerpackungen oder Kaffeetassen.
Wir werden in den nächsten Artikeln über den Verkauf von nicht-physischen Dingen (Dienstleistungen) sprechen.
Attribute im product
Tabelle sind:
name
– der Name des Produkts im Systemprice_per_unit
– Produktkosten pro Einheit (z. B. 1 Tasse Kaffee kostet 1,8 Euro, 1 Auto kostet 17.500 Euro, 1 kg Reis kostet 2 Euro)basic_unit
– Basiseinheit, wenn wir ein Produkt verkaufen (z. B. Stück, kg, Liter)tax_percentage
– Prozent des als Steuer zu erhebenden Preises pro Einheit. Wir müssen davon ausgehen, dass der Steuerprozentsatz nicht für alle Produkte gleich wärelimited
– Dieses Feld ist auf True gesetzt, wenn wir eine begrenzte Menge auf Lager haben, andernfalls auf False (z. B. können wir jede Menge, die wir für unseren Shop benötigen, bei einem Händler bestellen)in_stock
– Wenn limited=True zeigt dieses Attribut an, wie viele wir zum Verkauf habenactive_for_sale
– Wenn dieses Attribut falsch ist, bieten wir dieses Produkt derzeit nicht zum Verkauf an, andernfalls können wir es Kunden anbieten
Mit der folgenden Abfrage können wir eine Liste der Produkte abrufen, die wir unseren Kunden anbieten können:
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))
Die Tabelle sale_status
ist nur ein einfaches Wörterbuch, das alle Status enthält, die ein Verkauf im System haben kann (z. B. „Kassenbon ausgestellt“, „Kassenbon bezahlt“).
Der Tisch
sale
ist die zweitwichtigste Tabelle in diesem Modell. Bisher hat diese Tabelle keine Verbindung zu Kunden, an die wir Produkte verkauft haben, da wir in unserem Café-Beispiel solche Informationen nicht kennen müssen. In Teil 2 wird das Modell um solche Fälle erweitert. Attribute in der Tabelle und ihre Bedeutung sind:
time_created
– Zeitpunkt, zu dem ein Verkaufsdatensatz im System generiert wurde (z. B. automatischer Zeitpunkt, zu dem der Datensatz erstellt wurde, als wir einen Verkauf für Kaffee in unserem Café generierten, oder ein manuell hinzugefügter Zeitpunkt, wenn wir dies wünschen)time_paid
– Im Allgemeinen können wir davon ausgehen, dass einige Verkäufe innerhalb weniger Tage oder sogar eines Monats nach der Erstellung bezahlt werden (z. B. wenn wir Software liefern und eine Quittung erstellen, können wir in einigen Ländern bis zu 90 Tage auf die Zahlung warten, wenn alles klappt das Gesetz)sale_amount
– ursprünglicher Betrag, der dem Kunden in Rechnung gestellt werden sollsale_amount_paid
– Betrag, den der Kunde tatsächlich bezahlt hat. Es kann null sein, da wir im Moment, in dem wir einen Beleg erstellen, diese Informationen nicht immer habentax_amount
– Summe aller Steuerbeträge für Artikel auf diesem Belegsale_status_id
– Verweis aufsale_status
Tabelleuser_has_role_id
– Verweis auf den Benutzer und seine Rolle zum Zeitpunkt der Eingabe des Belegs in das System
Wir können den ausgestellten und bezahlten Betrag (gemäß time_created) innerhalb eines bestimmten Zeitraums mit einer Abfrage wie dieser abrufen:
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;
Um den genauen gezahlten Betrag innerhalb eines bestimmten Zeitraums zu erhalten, müssen wir eine Abfrage wie diese verwenden:
SELECT SUM(sale.sale_amount_paid) AS amount_paid FROM sale WHERE sale.time_paid >= @start_time AND sale.time_paid <= @end_time;
Die folgende Abfrage berechnet den ausgestellten und gezahlten Betrag innerhalb eines Zeitraums, wobei das Ausstellungsdatum und das Zahlungsdatum separat geprüft werden:
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
In allen Beispielen @start_time
und @end_time
sind Variablen, die die Start- und Endzeit des Zeitraums enthalten, für den wir die ausgestellte und bezahlte SUM überprüfen möchten.
Die Tabelle sale_item
verbindet Produkte und Vertrieb. Natürlich müssen wir davon ausgehen, dass wir mehrere Artikel haben werden auf einem Beleg, also brauchen wir diese Tabelle, um eine Viele-zu-Viele-Beziehung zu haben.
Attribute und ihre Bedeutung sind:
quantity_sold
– Produktmenge, die verkauft wurde und mit diesem Verkauf/Kassenbon verrechnet wird (z. B. 3 Kaffees)price_per_unit
– gleicher Wert wieproduct.price_per_unit
in dem Moment, in dem der Verkauf erstellt wurde. Wir müssen es speichern, weilprice_per_unit
improduct
Tabelle kann sich im Laufe der Zeit ändernprice
– Produkt vonquantity_sold
undprice_per_unit
; eine kleine Redundanz, die uns hilft, diese Berechnung in Abfragen zu vermeiden. Im Allgemeinen sollte die Summe aller Artikelpreise, die zu demselben Verkauf gehören, gleich demsale.sale_amount
seintax_amount
– Steuerbetrag für diesen Artikel bei Erhaltsale_id
– ID des Verkaufs, zu dem dieser Artikel gehörtproduct_id
– Produkt-ID zu diesem Artikel
Wir könnten jetzt ganz einfach einen einfachen Bericht darüber erstellen, wie viele Produkte/Dienstleistungen wir im Zeitraum verkauft haben und zu welchem Preis.
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