SQL Abfrage mit Schleife

winscheil

Aktiver Benutzer
Beiträge
25
Hallo,

ich habe eine Tabelle mit folgendem Aufbau:
AUFTRAG, START_TAG, ENDE_TAG, PRO_WOCHE
ABC, 2018-05-07, 2018-09-07, 38699,19
DEF, 2018-03-05, 2018-04-27, 3215,15
XYZ, 2018-07-23, 2018-11-09, 11315,35

Da ist der Auftrag, ein Starttag, ein Endtag und der Geldwert, der Pro Woche zwischen Starttag und Endtag anfällt.

Jetzt will ich eine Abfrage machen, die mir pro Woche in dem Zeitraum zwischen Starttag und Endtag eine neue Zeile erstellt.
Ich überprüfe den Starttag, ob er kleiner gleich dem Endtag ist und erhöhe den Starttag immer um eine Woche und vergleiche dann wieder.
Solange der Starttag nach den Erhöhungen kleiner als der Endtag ist, wird eine neue Zeile pro Woche erstellt.


Bsp:
AUFTRAG, DATUM, PRO_WOCHE
ABC, 2018-05-07, 38699, 19
ABC, 2018-05-14, 38699, 19
ABC, 2018-05-21, 38699, 19
...
ABC, 2018-09-03, 38699, 19

Das habe ich so gemacht:
declare @zaehler int
set @zaehler = 0
while @zaehler <=(selectDATEDIFF(WEEK,START_TAG,ENDE_TAG) from QUELLTABELLE where AUFTRAG ='123')
BEGIN
insert into ZIELTABELLE
select AUFTRAG,DATEADD(WEEK,@zaehler, START_TAG) as DATUM, PRO_WOCHE from QUELLTABELLE where AUFTRAG ='123'
set @zaehler += 1
END

Das funktioniert jetzt für einen Eintrag der obigen Quelltabelle.
Aber ich weiß jetzt nicht, wie ich das auf die ganze Quelltabelle ausbaue, dass für alle Einträge/Zeilen in der Quelltabelle neue Einträge/Zeilen in die Zieltabelle geschrieben werden.

Ich hoffe, ich habe alles verständlich erklärt.
Kann mir da jemand helfen?
 
Werbung:
Du hast:

Code:
test=*# select * from winschell ;
 auftrag | start_tag  |  end_tag  | extra_feld | pro_woche
---------+------------+------------+------------+-----------
 abc  | 2018-05-07 | 2018-09-07 |  38699 |  19
 def  | 2018-03-05 | 2018-04-27 |  3215 |  15
 xyz  | 2018-07-23 | 2018-11-09 |  11315 |  35
(3 Zeilen)

PS.: Deine Tabelle hat im Kopf 4 Felder, dann aber 5. Ich hab es extra_feld genannt.

Und nun suchst Du:

Code:
test=*# select auftrag, start_tag + s.s * '1 week'::interval as datum, extra_feld, pro_woche from winschell w left outer join lateral (select * from generate_series(0,(w.end_tag-w.start_tag)/7)s) s on true;
 auftrag |  datum  | extra_feld | pro_woche
---------+---------------------+------------+-----------
 abc  | 2018-05-07 00:00:00 |  38699 |  19
 abc  | 2018-05-14 00:00:00 |  38699 |  19
 abc  | 2018-05-21 00:00:00 |  38699 |  19
 abc  | 2018-05-28 00:00:00 |  38699 |  19
 abc  | 2018-06-04 00:00:00 |  38699 |  19
 abc  | 2018-06-11 00:00:00 |  38699 |  19
 abc  | 2018-06-18 00:00:00 |  38699 |  19
 abc  | 2018-06-25 00:00:00 |  38699 |  19
 abc  | 2018-07-02 00:00:00 |  38699 |  19
 abc  | 2018-07-09 00:00:00 |  38699 |  19
 abc  | 2018-07-16 00:00:00 |  38699 |  19
 abc  | 2018-07-23 00:00:00 |  38699 |  19
 abc  | 2018-07-30 00:00:00 |  38699 |  19
 abc  | 2018-08-06 00:00:00 |  38699 |  19
 abc  | 2018-08-13 00:00:00 |  38699 |  19
 abc  | 2018-08-20 00:00:00 |  38699 |  19
 abc  | 2018-08-27 00:00:00 |  38699 |  19
 abc  | 2018-09-03 00:00:00 |  38699 |  19
 def  | 2018-03-05 00:00:00 |  3215 |  15
 def  | 2018-03-12 00:00:00 |  3215 |  15
 def  | 2018-03-19 00:00:00 |  3215 |  15
 def  | 2018-03-26 00:00:00 |  3215 |  15
 def  | 2018-04-02 00:00:00 |  3215 |  15
 def  | 2018-04-09 00:00:00 |  3215 |  15
 def  | 2018-04-16 00:00:00 |  3215 |  15
 def  | 2018-04-23 00:00:00 |  3215 |  15
 xyz  | 2018-07-23 00:00:00 |  11315 |  35
 xyz  | 2018-07-30 00:00:00 |  11315 |  35
 xyz  | 2018-08-06 00:00:00 |  11315 |  35
 xyz  | 2018-08-13 00:00:00 |  11315 |  35
 xyz  | 2018-08-20 00:00:00 |  11315 |  35
 xyz  | 2018-08-27 00:00:00 |  11315 |  35
 xyz  | 2018-09-03 00:00:00 |  11315 |  35
 xyz  | 2018-09-10 00:00:00 |  11315 |  35
 xyz  | 2018-09-17 00:00:00 |  11315 |  35
 xyz  | 2018-09-24 00:00:00 |  11315 |  35
 xyz  | 2018-10-01 00:00:00 |  11315 |  35
 xyz  | 2018-10-08 00:00:00 |  11315 |  35
 xyz  | 2018-10-15 00:00:00 |  11315 |  35
 xyz  | 2018-10-22 00:00:00 |  11315 |  35
 xyz  | 2018-10-29 00:00:00 |  11315 |  35
 xyz  | 2018-11-05 00:00:00 |  11315 |  35
(42 Zeilen)

Achtung: ist mit PostgreSQL gemacht. Das hat so nette Gimmicks wie generate_series() und kann auch LATERAL JOIN. Aber vielleicht inspiriert es Dich ja ;-)
 
stimmt, dass wollte ich eigentlich einfachhalber hier nicht anzeigen. Ist die Berechnung der KW.
Aber ich bin leider zu sehr Laie, als dass ich genau verstehe, was du gemacht hast.
Ich kenne mich bei PostgreSQL nicht aus und von dem Lateral Join hab ich leider auch noch nichts gehört.
Ich weiß nicht, wie ich das bei MS SQL anwenden kann.
 
Werbung:
Möglicherweise wird M$SQL das nicht können. Mit PostgreSQL kann halt kaum eine andere Datenbank mithalten... aber vielleicht meldet sich ja noch jemand mit einer genialen Idee.
 
Zurück
Oben