186 lines
4.5 KiB
Transact-SQL
186 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 koennen.
|
|
|
|
Ausfuehrung:
|
|
- In der Legacy-Datenbank ausfuehren.
|
|
- 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-/Verbrauchseintraege 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-Rueckseite 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;
|
|
|