SQL Datensatz einfügen

winscheil

Cadet 2nd Year
Registriert
Apr. 2017
Beiträge
17
Hallo,

ich habe folgende Ausgangslage:
Arbeitszeiten nach Kalenderwochen unterteilt.
Bsp.:
KW JAHR STUNDEN AUFTRAG
42 2024 60 XYZ
43 2024 65 XYZ
45 2024 55 XYZ
46 2024 70 XYZ
48 2024 60 XYZ
...

Wie ihr sehen könnt, fehlen die Zeiten der KW 44 und KW 47.
Hier sind keine Zeiten aufgelaufen, darum habe ich dazu keinen Datensatz.
In einem Balkendiagramm sollen diese beiden fehlenden KWs schon erscheinen.
Somit brächte ich Datensätze für die fehlenden KWs.
Bsp.:
KW JAHR STUNDEN AUFTRAG
42 2024 60 XYZ
43 2024 65 XYZ
44 2024 0 XYZ
45 2024 55 XYZ
46 2024 70 XYZ
47 2024 0 XYZ
48 2024 60 XYZ

Wie kann ich diese fehlenden KWs hinzufügen?
Der SQL ist aktuell ungefähr so:
select KW, JAHR, SUM(STUNDEN) as STUNDEN, AUFTRAG from QUELLE
group by KW, JAHR, AUFTRAG
 
Für eine passende Auswertung müssen die Datensätze der fehlenden KW in der Quelle vorhanden sein.
Dafür muss man mit einem Insert die enstprechenden Daten einpflegen.
 
Alternativ grouping auf die KW und über when im Zweifel 0 Werte erzeugen, da der Server sonst Null ausgibt
 
  • Gefällt mir
Reaktionen: Teckler und andy_0
Gibt es pro KW immer nur einen Eintrag? Und welche Datenbank wird verwendet?

Unter MariaDB sollte ungefähr so was in dieser Richtung funktionieren:
SQL:
SELECT seq AS KW, IFNULL(JAHR, 2024) AS JAHR, IFNULL(STUNDEN, 0) AS STUNDEN, IFNULL(AUFTRAG, 'keiner') AS AUFTRAG
FROM (SELECT seq FROM seq_1_to_52
      LEFT JOIN
      SELECT KW, JAHR, SUM(STUNDEN) AS STUNDEN, AUFTRAG FROM QUELLE
      ON seq = KW)
Das Geheimnis liegt darin, von einer vollständigen KW-Liste auszugehen und darauf die tatsächlichen vorhandenen Daten zu matchen. Die KW-Liste wird mit seq_1_to_52 generiert (erzeugt eine Menge mit den Zahlen von 1 bis 52).
 
  • Gefällt mir
Reaktionen: DoNG, tRITON, Teckler und 2 andere
Ausgangslage ist eine Tabelle mit allen täglichen gestempelten Arbeitszeiten bezogen auf Aufträge.
Diese Zeiten werden dann in KWs summiert/groupiert.
Und es gibt Aufträge bei denen in manchen Wochen nicht gearbeitet wird.
Somit sind in diesen Wochen auch keine Datensätze in der Tabelle.
Diese Wochen fehlen dann nach dem Groupieren und zwar berechtigt, weil ja keine Daten da sind.
Wie kann man diese fehlenden KWs bei den einzelnen Aufträgen ergänzen?
 
@Krik man müsste den Sonderfall von 53 KWs noch berücksichtigen :)
 
Der schnellste Weg?
Installier SSMS (SQL Server Management Studio) verbind dich mit der DB und füge die Zeilen händisch hinzu
 
Zuletzt bearbeitet:
kartoffelpü schrieb:
@Krik man müsste den Sonderfall von 53 KWs noch berücksichtigen :)
Man kann auch die KWs auf Basis von Daten generieren. So was in der Art:
SQL:
SELECT WEEKOFYEAR(DATUM) AS KW, YEAR(DATUM) AS JAHR
FROM SELECT '2025-01-20' + INTERVAL (7 * seq) DAYS AS DATUM FROM seq_0_to_106

Sollte es da irgendwo eine KW 53 geben, dann wird die entsprechend ausgerechnet.


Ich weiß allerdings nicht, ob es den Sequenzgenerator auch für MS SQL gibt. Ich hab immer nur in MariaDB gearbeitet.
 
  • Gefällt mir
Reaktionen: Jacek Pavlovski und kartoffelpü
Es gibt keinen so eleganten Weg in TSQL, zumindest keinen der mir einfällt. Da muss man schön sequence noch mit Create Sequence und so erzeugen.
 
  • Gefällt mir
Reaktionen: Krik
Alternativ einfach eine Tabelle mit Nummern machen, die man dafür ausliest.

Die Daten solltest du auf keinen Fall händisch ergänzen.
Eine Liste der KWs abfragen/erstellen und mit left join deine Tabelle anbinden.
 
  • Gefällt mir
Reaktionen: Krik
So eine Tabelle hatte ich auch eine Weile lang. Die hatte ein Kollege generiert und hatte für jeden Tag einen Eintrag mit Datum, KW, Monat, Jahr, usw. Kann man ruhig machen. Man muss nur dran denken, die Tabelle regelmäßig zu erweitern.
 
@Krik Das geht auch, ich dachte jetzt einfach an eine Tabelle mit einem int, in der die Zahlen 1 ... x eingetragen sind. Ersetzt die Sequence.

Das Problem mit den existierenden KWs im Jahr ist damit nicht gelöst, könnte aber abgeleitet werden (aus der ISO-Norm). KWs und deren Start-/Enddatum machen halt nie Spaß ;).
 
Tolotos schrieb:
KWs und deren Start-/Enddatum machen halt nie Spaß ;).
Jepp. Deswegen bin ich damals dann auch von der simplen 1-bis-x-Tabelle weg hin zu der errechne-alles-in-einem-Datumsbereich-Tabelle. Ich habe mir dafür extra eine FUNCTION gebaut, da ich das häufiger gebraucht habe.
Hat man so was erst mal fertig, wird die Arbeit deutlich einfacher. :)
 
Eigentlich ist es recht unelegant die Quelldaten zu verändern.
Ich würde da entweder eine View (statt INSERT) oder Anpassung bei Diagrammerstellung (Excel?) vorschlagen.
 
  • Gefällt mir
Reaktionen: Jacek Pavlovski
Zurück
Oben