Gelöst MySQL Abfrage Kalenderwochen ohne Lücken

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
icho2099
Beiträge: 37
Registriert: Fr 21. Feb 2020, 19:17
OS, Lazarus, FPC: Win10/64
CPU-Target: 64 Bit
Wohnort: Osterholz-Scharmbeck

Gelöst MySQL Abfrage Kalenderwochen ohne Lücken

Beitrag von icho2099 »

Bitte entschuldigt den etwas holprigen Titel.
Ich habe eine Tabelle welche auch eine Datumspalte enthält. Eine Abfrage soll Werte der Tabelle in Kalenderwochen gruppieren, das ist gelöst.
Aber es gibt nicht zu jeder KW auch Datensätze, was dazu führt, dass die Abfrage Lücken in der Ergebnisspalte Kalenderwoche aufweist.
Nun wäre die Idee die Wochennummer zB aus einer extra dazu erstellten Hilfstabelle zu nehmen und per offenem Join mit der Abfrage zu verbinden.
Aber das ist umständlich.
Kann man das auch in einer Art Loop direkt in der Abfrage unterbringen? Bei MariaDB scheint es dafür etwas zu geben.
Hat vielleicht jemand einen Tipp für mich?
Muss aber in MySQL funktionieren.
Ich verwende ZEOS Komponenten.
Danke für jeden Tipp.
Zuletzt geändert von icho2099 am Di 10. Dez 2024, 23:17, insgesamt 1-mal geändert.

Benutzeravatar
Zvoni
Beiträge: 171
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit
Wohnort: BW

Re: MySQL Abfrage Kalenderwochen ohne Lücken

Beitrag von Zvoni »

Welche MySQL-Version? Hoffentlich MySQL 8
Und welches Zeitfenster betrachtet deine Abfrage?
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

icho2099
Beiträge: 37
Registriert: Fr 21. Feb 2020, 19:17
OS, Lazarus, FPC: Win10/64
CPU-Target: 64 Bit
Wohnort: Osterholz-Scharmbeck

Re: MySQL Abfrage Kalenderwochen ohne Lücken

Beitrag von icho2099 »

Zvoni hat geschrieben: Di 10. Dez 2024, 08:20 Welche MySQL-Version? Hoffentlich MySQL 8
Und welches Zeitfenster betrachtet deine Abfrage?
Version ist 8
Das Zeitfenster kann beliebig sein, durchaus auch über den Jahreswechsel hinaus und auch über mehrere Jahre.
Man kennt immer das Anfangsdatum und die Anzahl Wochen die abgefragt werden sollen.

Benutzeravatar
Zvoni
Beiträge: 171
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit
Wohnort: BW

Re: MySQL Abfrage Kalenderwochen ohne Lücken

Beitrag von Zvoni »

icho2099 hat geschrieben: Di 10. Dez 2024, 11:05
Zvoni hat geschrieben: Di 10. Dez 2024, 08:20 Welche MySQL-Version? Hoffentlich MySQL 8
Und welches Zeitfenster betrachtet deine Abfrage?
Version ist 8
Das Zeitfenster kann beliebig sein, durchaus auch über den Jahreswechsel hinaus und auch über mehrere Jahre.
Man kennt immer das Anfangsdatum und die Anzahl Wochen die abgefragt werden sollen.
Ah ja.
Lässt sich mit einem rekursiven CTE lösen, welches dir dann die Zeitleiste erzeugt, und gegen diese kannst du dann deine Daten joinen.
Mach ich hier auf unserer IBM DB2 mehr oder weniger einmal pro Monat

https://www.geeksforgeeks.org/mysql-rec ... pressions/
https://dev.mysql.com/doc/refman/8.4/en ... weekofyear

Aircode (Ungetestet)

Code: Alles auswählen

WITH RECURSIVE
   ZL(JahrWoche, Anfangsdatum, Zahl) AS 
   (SELECT YEARWEEK(Anfangsdatum, 3) AS JahrWoche, AnfangsDatum, 1 As Zahl FROM MeineTabelle
    UNION ALL
    SELECT YEARWEEK(DATE_ADD(AnfangsDatum, INTERVAL 1 WEEK), 3), DATE_ADD(AnfangsDatum, INTERVAL 1 WEEK), Zahl+1 FROM ZL
    WHERE Zahl+1<=53) --Für ein volles Jahr in die Zukunft ab Anfangsdatum
 
SELECT ZL.JahrWoche, MT.MeineJahrWoche, ....... 
FROM ZL 
LEFT JOIN MeineTabelle AS MT ON ZL.JahrWoche=MT.MeineJahrWoche
ORDER BY ZL.JahrWoche
Hier ein fiddle für 12 Wochen
https://dbfiddle.uk/SzmnW44B

Wenn du in dem fiddle mal aus dem '2024-01-01' (Zeile 3 und 4) ein '2024-11-01' machst, siehst du auch den Jahressprung, dass dieser Korrekt ausgeführt wird.

Vorsicht mit dem Parameter "3" in YEARWEEK:
Das ist eigentlich der reguläre Parameter für die Kalenderwoche nach ISO8601
"Die erste Kalenderwoche eines Jahres ist die Woche, welche den ersten Donnerstag oder den 04. Januar beinhaltet, wenn Montag der erste Tag der Woche ist"
Also Vorsicht, falls du den weglässt oder einen anderen Wert benutzen solltest

EDIT: Da, wie du gesagt hast, nicht zu jeder Kalender-Woche auch ein Ergebnis aus deiner Abfrage entsteht, und wir hier bei einem LEFT JOIN sind, dann solltest du dir auch mal die COALESCE-Funktion anschauen. Da bei so einem LEFT JOIN dann NULLs auftauchen, wo es keinen Match gibt, kann man mit COALESCE einen "Default"-Wert anzeigen lassen

Code: Alles auswählen

WITH RECURSIVE
   ZL(JahrWoche, Anfangsdatum, Zahl) AS 
   (SELECT YEARWEEK(Anfangsdatum, 3) AS JahrWoche, AnfangsDatum, 1 As Zahl FROM MeineTabelle
    UNION ALL
    SELECT YEARWEEK(DATE_ADD(AnfangsDatum, INTERVAL 1 WEEK), 3), DATE_ADD(AnfangsDatum, INTERVAL 1 WEEK), Zahl+1 FROM ZL
    WHERE Zahl+1<=53) --Für ein volles Jahr in die Zukunft ab Anfangsdatum
 
SELECT ZL.JahrWoche, 
COALESCE(MT.MeinUmsatz, 0) AS Umsatz --HIER!!
....... 
FROM ZL 
LEFT JOIN MeineTabelle AS MT ON ZL.JahrWoche=MT.MeineJahrWoche
ORDER BY ZL.JahrWoche
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

icho2099
Beiträge: 37
Registriert: Fr 21. Feb 2020, 19:17
OS, Lazarus, FPC: Win10/64
CPU-Target: 64 Bit
Wohnort: Osterholz-Scharmbeck

Re: MySQL Abfrage Kalenderwochen ohne Lücken

Beitrag von icho2099 »

Perfekt, besten Dank, funktioniert.

Benutzeravatar
Zvoni
Beiträge: 171
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit
Wohnort: BW

Re: Gelöst MySQL Abfrage Kalenderwochen ohne Lücken

Beitrag von Zvoni »

Nachtrag: Keine Ahnung wie bewandert du mit SQL du bist:
ein CTE (Das "WITH..." oben) kann nicht parametriert werden.

Also ein
"WITH
blabbalblabka
WHERE Zahl+1<=:MeineZahl)"
und dann ein MyQuery.ParamByName('MeineZahl').AsInteger:=42 geht nicht.

MUSS per String-Concatenation im Code erfolgen
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

Antworten