Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

SQL Abfrage mit Schleife

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von winscheil, 22 März 2018.

  1. winscheil

    winscheil Benutzer

    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?
     
  2. akretschmer

    akretschmer Datenbank-Guru

    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 ;-)
     
  3. winscheil

    winscheil Benutzer

    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.
     
  4. akretschmer

    akretschmer Datenbank-Guru

    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.
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden