Zum Inhalt springen

SQL Views

Wenn direkter SQL-Zugriff auf die Kassa gefragt ist — meist weil APRO On-Premise neben bestehenden Systemen läuft — stellt die Kassendatenbank einen stabilen Satz lesender Views bereit. Sie sind gezielt auf die beiden häufigsten Konsumenten zugeschnitten:

  • On-Premise-Integrationen — Buchhaltungsbrücken, Küchenmonitore, Warenwirtschaft, Loyalty-Engines — alles, was im selben Netz läuft und einen schnellen Datenfluss ohne Umweg über REST braucht.
  • Bestehende BI-Workflows — Power BI, Tableau, Qlik, Metabase, Excel, SQL Server Analysis Services — jedes Tool, das bereits SQL-Server-Connections versteht. Connector auf die Views zeigen und du hast Belege, Positionen, Zahlungen und Artikelstamm in der Form, die ein Data Warehouse erwartet.

Die Views sind ausschließlich lesend, über das Standard-SQL-Server- Protokoll abfragbar und greifen nicht auf operative Tabellen zu, die unter Last mutieren — sie sind sicher für Dashboards und geplante ETL-Jobs.

Übersicht

ViewInhalt
vw_ReceiptsEine Zeile pro Geschäftsvorfall.
vw_Receipt_ItemsPositionen. Join über ReceiptId.
vw_PaymentsZahlungen. Join über ReceiptId.
vw_TransactionsLeichter Transaktions-Index.
vw_TransactionTypesLookup der Transaktionstypen.
vw_Bi_ExportDenormalisiertes Beleg × Position + Zahlungsübersicht — Startpunkt für Power BI.
vw_products_and_categoriesArtikelstamm mit Sparte.

1. vw_Receipts

Eine Zeile pro Geschäftsvorfall. Die Spalte TransactionType sagt, was die Zeile repräsentiert; Beträge sind vorzeichenbehaftet — bei Stornos (TransactionType = 4) sind sie negiert, damit SUM(TotalAmount) direkt netto rechnet.

SpalteTypBeschreibung
IdGUIDEindeutige ID des Geschäftsvorfalls.
TransactionIdGUIDTransaktions-ID (Join-Schlüssel für vw_Receipt_Items, vw_Payments).
TransactionTypeenumSiehe Transaktionstypen.
TransactionTypeNamestringLesbarer Transaktionstyp.
ReceiptNrstringBeleg-/Rechnungsnummer.
TotalAmountdecimalBruttosumme (signed — negativ bei Stornos).
TipAmountdecimalTrinkgeld (signed).
ReceiptDiscountAmountdecimalRabatt auf Gesamtbeleg (signed).
BookDatedatetimeBuchungszeitpunkt.
BusinessDaydateVirtueller Geschäftstag.
ParentIdGUID | nullVorgänger-Beleg (z. B. bei Rückholung Verweis auf Original).
PaymentGroupIdinteger | nullZahlungsgruppen-ID (z. B. Umsatzwirksam).
PaymentGroupNamestring | nullName der Zahlungsgruppe — nützlich als Umsatzfilter.
BusinessIdintegerID des durchführenden Unternehmens.
BusinessNamestringFirmenname.
TableIdintegerTisch-ID.
TableNrintegerTischnummer.
TableNamestringTischbezeichnung.
AreaIdintegerBereichs-ID.
AreaNrintegerBereichsnummer.
AreaNamestringBereichsname (Restaurant, Bar, Terrasse …).
StaffIdintegerMitarbeiter-ID.
StaffNrintegerPersonalnummer.
StaffNamestringMitarbeitername.
CustomerIdintegerKunden-ID.
CustomerNrintegerKundennummer.
CustomerNamestringKundenname.
DeviceIdintegerAusführendes Gerät.

Transaktionstypen

Die View enthält nur Transaktionen mit TransactionType in (1, 2, 3, 4, 5, 14, 24, 25). Das autoritative Mapping liegt in vw_TransactionTypes und ist auch pro Zeile als TransactionTypeName beigefügt.

TransactionTypeBedeutung
1Bestellung — Eingabe am Tisch oder SB.
2Verschiebung — Tischwechsel.
3Abrechnung — bezahlter Beleg.
4Storno — Umkehr einer Bestellung (Beträge negiert).
5Rechnung zurückholen — Umkehr einer Abrechnung.
14Ausgangsrechnung erstellt.
24Ausgangsrechnung — zusätzlich (siehe vw_TransactionTypes).
25Ausgangsrechnung bezahlt.

2. vw_Receipt_Items

Positionen. Join mit vw_Receipts über ReceiptId / TransactionId. Werte sind wie beim Beleg vorzeichenbehaftet.

SpalteTypBeschreibung
TransactionIdGUIDTransaktions-ID.
ReceiptIdGUIDBeleg-ID (Join auf vw_Receipts.Id).
ReceiptItemIdGUIDEindeutige Positions-ID.
BookedItemIdGUIDUnterliegende Bonierungs-ID (gemeinsam zwischen Buchung und Storno).
BookedItemDatedatetimeBonierungszeitpunkt.
ProductCategoryIdintegerSparten-ID.
ProductCategoryNrintegerSparten-Nummer.
ProductCategoryNamestringSparten-Bezeichnung.
ProductCategoryAccountingNrstringBuchungskonto-Nummer der Sparte.
ProductIdintegerArtikel-ID.
ProductNrintegerArtikelnummer.
ProductNamestringArtikelname.
QuantitydecimalStückzahl (signed bei Stornos / Rückholungen).
OriginalPricedecimalUrsprünglicher Einzelpreis zum Ausführungszeitpunkt (signed bei Stornos).
EffectivePricedecimalTatsächlicher Einzelpreis nach Rabatt (signed bei Stornos).
OriginalAmountdecimalStück × Originalpreis (signed).
EffectiveAmountdecimalStück × Originalpreis × Rabattfaktor (signed).
DiscountAmountdecimalRabattbetrag in Geld (signed bei Stornos / Rückholungen).
DiscountPercentagedecimalRabatt in % des Originalpreises.
DiscountTypestringRABATT OFF für klassische Rabatte, sonst die Kampagnenbezeichnung (z. B. Happy Hour). Leer, wenn kein Rabatt.
TaxIdintegerSteuersatz-ID.
TaxNamestringSteuersatz-Name.
TaxAmountdecimalSteuersatz als Dezimalwert.
TransactionTypeIdenumSelbe Codes wie vw_Receipts.TransactionType.

3. vw_Payments

Zahlungen zu Belegen. Enthalten sind nur Abrechnungen und ihre Rückholungen (TransactionType in (3, 4, 5, 14, 24, 25)).

SpalteTypBeschreibung
TransactionIdGUIDTransaktions-ID.
ReceiptIdGUIDBeleg-ID.
PaymentIdGUIDEindeutige Zahlungs-ID.
TotalAmountdecimalGezahlter Betrag (signed).
PaymentTypeIdintegerZahlungsmittel-ID.
PaymentTypeNrintegerZahlungsmittel-Nummer.
PaymentTypeNamestringZahlungsmittel (z. B. Bar, Kreditkarte, Gutschein).
DateTimedatetimeZahlungszeitpunkt.
PredecessorReceiptIdGUID | nullBei Rückholung der Original-Beleg, den diese Zahlung aufhebt.
Detailsstring | nullFreitext-Metadaten zur Zahlung (z. B. maskierte PAN, Gutscheincode).

4. vw_Transactions

Leichter Index aller Transaktionen. Nützlich für Wasserzeichen-ETL (nur neue Zeilen seit dem letzten Checkpoint ziehen).

SpalteTypBeschreibung
TransactionIdGUIDTransaktions-ID.
TransactionTypeenumTransaktionstyp.
TransactionTypeNamestringLesbarer Name.
BookDatedatetimeZeitpunkt der Transaktion.
DeviceIdintegerAusführendes Gerät.

5. vw_TransactionTypes

Lookup aller Transaktionstypen, die die Kassa erzeugt.

SpalteTypBeschreibung
IdintegerTransaktionstyp-ID.
BezeichnungstringLesbare Bezeichnung (deutsch).

6. vw_Bi_Export

Die One-Stop-View für BI-Tools. Denormalisierter Join aller umsatzrelevanten Belege mit all ihren Positionen, plus einer komma-separierten Zusammenfassung der verwendeten Zahlungsmittel. Power BI oder Tableau auf diese View zeigen — und du hast alles für Umsatz-, Marge-, Mix- und Zahlungsmittel-Dashboards, ohne Joins schreiben zu müssen.

Spalten sind die Vereinigung von vw_Receipts und vw_Receipt_Items (ohne TransactionTypeId, das nur auf der Belegseite vorkommt), plus:

SpalteTypBeschreibung
PaymentsstringKomma-separierte Liste der PaymentTypeName-Werte (z. B. "Bar,Kreditkarte"). NULL auf Nicht-Abrechnungszeilen.

Power-BI-Beispiel

  1. Daten abrufen → SQL-Server-Datenbank — Server + Datenbank wie bereitgestellt.
  2. Import- oder DirectQuery-Modus, lesender User.
  3. dbo.vw_Bi_Export als Fakt-Tabelle wählen.
  4. Optional dbo.vw_Transactions, dbo.vw_Payments, dbo.vw_products_and_categories als Dimensions-Tabellen hinzufügen und über TransactionId / ProductId verknüpfen.

Der Import-Modus reicht in der Regel — die Views sind bereits auf Transaktionsebene aggregiert und aktualisieren sich bei einem typischen Betrieb in Sekunden.

7. vw_products_and_categories

Artikelstamm mit Sparte. Eignet sich als Dimension neben vw_Bi_Export, wenn BI-Artikelnamen stabil bleiben sollen, auch wenn historische Zeilen vor einer Umbenennung liegen.

SpalteTypBeschreibung
ProductIdintegerArtikel-ID.
ProductNrintegerArtikelnummer.
ProductNamestringArtikelname.
ProductCategoryIdintegerSparten-ID.
ProductCategoryNrintegerSparten-Nummer.
ProductCategoryNamestringSparten-Name.
PricedecimalAktueller Listenpreis (Preis1).

Nur Artikel mit Geloescht = 0 (nicht soft-gelöscht) sind enthalten.

Beispiel-Queries

Umsatz pro Geschäftstag, nach Steuersatz — für einen Monats-KPI:

SELECT
r.BusinessDay,
ri.TaxName,
SUM(ri.EffectiveAmount) AS netto_umsatz
FROM vw_Receipts AS r
JOIN vw_Receipt_Items AS ri ON ri.ReceiptId = r.Id
WHERE r.TransactionType IN (3, 4, 5) -- Abrechnungen + Stornos rechnen netto
AND r.BusinessDay BETWEEN @from AND @to
GROUP BY r.BusinessDay, ri.TaxName
ORDER BY r.BusinessDay, ri.TaxName;

Top-10-Artikel im aktuellen Monat — direkt über die BI-View:

SELECT TOP 10
ProductName,
SUM(Quantity) AS stueck,
SUM(EffectiveAmount) AS netto_umsatz
FROM vw_Bi_Export
WHERE BusinessDay >= DATEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), 1)
AND TransactionType IN (3, 4, 5)
GROUP BY ProductName
ORDER BY netto_umsatz DESC;

Bar vs. Karte für einen einzelnen Geschäftstag:

SELECT
PaymentTypeName,
SUM(TotalAmount) AS total
FROM vw_Payments
WHERE CAST(DateTime AS date) = @businessDay
GROUP BY PaymentTypeName;