Files
kaffeekasse-saas/docs/m0/golden-master-queries.sql

185 lines
4.5 KiB
Transact-SQL

/*
M0 Golden-Master Queries
Ziel:
- Fachliche Legacy-Ergebnisse exportieren, damit Migration und neue SaaS-App
gegen denselben Stand verglichen werden können.
Ausführung:
- In der Legacy-Datenbank ausführen.
- Ergebnisse je Query als CSV speichern.
- Keine personenbezogenen Exporte ins Repo committen.
*/
DECLARE @CurrentYear int = YEAR(GETDATE());
-- 1. Teilnehmer-Basisdaten
SELECT
m.MitarbeiterID,
m.Name,
m.Email,
m.aktiv,
m.admin
FROM kl_Mitarbeiter m
ORDER BY m.Name;
-- 2. Saldo je Teilnehmer
WITH payments AS (
SELECT
MitarbeiterID,
SUM(Betrag) AS total_payments
FROM kl_Einzahlungen
GROUP BY MitarbeiterID
),
consumption AS (
SELECT
MitarbeiterID,
SUM(Kosten) AS total_costs,
SUM(AnzahlStriche) AS total_marks
FROM kl_Kaffeeverbrauch
GROUP BY MitarbeiterID
)
SELECT
m.MitarbeiterID,
m.Name,
m.Email,
COALESCE(p.total_payments, 0) AS total_payments,
COALESCE(c.total_costs, 0) AS total_costs,
COALESCE(c.total_marks, 0) AS total_marks,
COALESCE(p.total_payments, 0) - COALESCE(c.total_costs, 0) AS balance
FROM kl_Mitarbeiter m
LEFT JOIN payments p ON p.MitarbeiterID = m.MitarbeiterID
LEFT JOIN consumption c ON c.MitarbeiterID = m.MitarbeiterID
ORDER BY m.Name;
-- 3. Jahreswerte je Teilnehmer
WITH year_payments AS (
SELECT
MitarbeiterID,
SUM(Betrag) AS year_payments
FROM kl_Einzahlungen
WHERE YEAR(Datum) = @CurrentYear
GROUP BY MitarbeiterID
),
year_consumption AS (
SELECT
MitarbeiterID,
SUM(Kosten) AS year_costs,
SUM(AnzahlStriche) AS year_marks
FROM kl_Kaffeeverbrauch
WHERE YEAR(Datum) = @CurrentYear
GROUP BY MitarbeiterID
)
SELECT
m.MitarbeiterID,
m.Name,
m.Email,
COALESCE(yp.year_payments, 0) AS year_payments,
COALESCE(yc.year_costs, 0) AS year_costs,
COALESCE(yc.year_marks, 0) AS year_marks
FROM kl_Mitarbeiter m
LEFT JOIN year_payments yp ON yp.MitarbeiterID = m.MitarbeiterID
LEFT JOIN year_consumption yc ON yc.MitarbeiterID = m.MitarbeiterID
ORDER BY m.Name;
-- 4. Letzte Einzahlungen je Teilnehmer
SELECT
e.EinzahlungsID,
e.MitarbeiterID,
m.Name,
m.Email,
e.Betrag,
e.Datum
FROM kl_Einzahlungen e
JOIN kl_Mitarbeiter m ON m.MitarbeiterID = e.MitarbeiterID
ORDER BY e.Datum DESC, e.EinzahlungsID DESC;
-- 5. Letzte Strich-/Verbrauchseinträge je Teilnehmer
SELECT
v.VerbrauchID,
v.MitarbeiterID,
m.Name,
m.Email,
v.AnzahlStriche,
v.Kosten,
v.KostenproStrich,
v.Datum,
v.Eintragsart
FROM kl_Kaffeeverbrauch v
JOIN kl_Mitarbeiter m ON m.MitarbeiterID = v.MitarbeiterID
ORDER BY v.Datum DESC, v.VerbrauchID DESC;
-- 6. Aktuelle Konfiguration
SELECT
*
FROM kl_config;
-- 7. Aktuelle und historische Hinweise
SELECT
id,
nachricht,
gueltig_bis
FROM kl_hinweise
ORDER BY gueltig_bis DESC;
-- 8. 100-Tage-Vorderseite analog Legacy-Stricherfassung
DECLARE @ReferenceDate date = (
SELECT MAX(CAST(Datum AS date))
FROM kl_Kaffeeverbrauch
WHERE Datum < CAST(GETDATE() AS date)
);
SELECT
m.MitarbeiterID,
m.Name,
m.Email,
SUM(v.AnzahlStriche) AS marks_in_window
FROM kl_Mitarbeiter m
JOIN kl_Kaffeeverbrauch v ON m.MitarbeiterID = v.MitarbeiterID
WHERE v.Datum >= DATEADD(DAY, -100, @ReferenceDate)
AND m.aktiv = 1
GROUP BY m.MitarbeiterID, m.Name, m.Email
HAVING SUM(v.AnzahlStriche) >= 10
ORDER BY m.Name;
-- 9. 100-Tage-Rückseite analog Legacy-Stricherfassung
SELECT
m.MitarbeiterID,
m.Name,
m.Email,
COALESCE(SUM(v.AnzahlStriche), 0) AS marks_in_window
FROM kl_Mitarbeiter m
LEFT JOIN kl_Kaffeeverbrauch v
ON m.MitarbeiterID = v.MitarbeiterID
AND v.Datum >= DATEADD(DAY, -100, @ReferenceDate)
WHERE m.aktiv = 1
GROUP BY m.MitarbeiterID, m.Name, m.Email
HAVING COALESCE(SUM(v.AnzahlStriche), 0) < 10
ORDER BY m.Name;
-- 10. CSV-Import-Dublettenbasis
SELECT
e.MitarbeiterID,
m.Name,
e.Betrag,
CONVERT(varchar, e.Datum, 23) AS booking_day,
COUNT(*) AS duplicates_per_day
FROM kl_Einzahlungen e
JOIN kl_Mitarbeiter m ON m.MitarbeiterID = e.MitarbeiterID
GROUP BY e.MitarbeiterID, m.Name, e.Betrag, CONVERT(varchar, e.Datum, 23)
HAVING COUNT(*) > 1
ORDER BY booking_day DESC, m.Name;
-- 11. Jahresauswertung: Gesamtstriche aktuelles Jahr
SELECT
m.MitarbeiterID,
m.Name,
m.Email,
SUM(v.AnzahlStriche) AS GesamtStriche
FROM kl_Kaffeeverbrauch v
JOIN kl_Mitarbeiter m ON v.MitarbeiterID = m.MitarbeiterID
WHERE YEAR(v.Datum) = @CurrentYear
AND m.aktiv = 1
GROUP BY m.MitarbeiterID, m.Name, m.Email
ORDER BY GesamtStriche DESC, m.Name;