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.
Gelöst MySQL Abfrage Kalenderwochen ohne Lücken
-
- Beiträge: 40
- 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
Zuletzt geändert von icho2099 am Di 10. Dez 2024, 23:17, insgesamt 1-mal geändert.
- Zvoni
- Beiträge: 190
- 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
Welche MySQL-Version? Hoffentlich MySQL 8
Und welches Zeitfenster betrachtet deine Abfrage?
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.
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.
-
- Beiträge: 40
- 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
Version ist 8Zvoni hat geschrieben: Di 10. Dez 2024, 08:20 Welche MySQL-Version? Hoffentlich MySQL 8
Und welches Zeitfenster betrachtet deine Abfrage?
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.
- Zvoni
- Beiträge: 190
- 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
Ah ja.icho2099 hat geschrieben: Di 10. Dez 2024, 11:05Version ist 8Zvoni hat geschrieben: Di 10. Dez 2024, 08:20 Welche MySQL-Version? Hoffentlich MySQL 8
Und welches Zeitfenster betrachtet deine Abfrage?
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.
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
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.
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.
-
- Beiträge: 40
- 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
Perfekt, besten Dank, funktioniert.
- Zvoni
- Beiträge: 190
- 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
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 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.
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.