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

(Historien) Dimensionstabelle mit SQL vervollständigen

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von Datenbank-Neuling, 30 Oktober 2018.

  1. Datenbank-Neuling

    Datenbank-Neuling Neuer Benutzer

    Hallo Zusammen,

    vielleicht kann mir hier jemand einen Tipp geben: eine Tabelle in der Form:

    Peter Hausnummer 11 (von) 01.01.2018 (bis) 31.03.2018
    Peter Hausnummer 13 (von) 01.04.2018 (bis) 31.12.2018

    möchte ich über einen SQL Befehle so erweitern, dass ich die Tabelle sinnvoll für jeden Monat im Jahr 2018 vorliegen hab. Also genauer in der Form:

    Peter Hausnummer 11 (von) 01.01.2018 (bis) 31.01.2018
    Peter Hausnummer 11 (von) 01.02.2018 (bis) 28.02.2018
    Peter Hausnummer 11 (von) 01.03.2018 (bis) 31.03.2018
    Peter Hausnummer 13 (von) 01.04.2018 (bis) 31.04.2018
    ....
    Peter Hausnummer 13 (von) 01.12.2018 (bis) 31.12.2018

    Habt Ihr Idee wie man hier vorgehen könnte? Eine Date Tabelle liegt mir bereits vor. Könnte man dies vielleicht mit einem JOIN Befehl erreichen?

    Viele Grüße
     
  2. akretschmer

    akretschmer Datenbank-Guru

    ja, mit einem JOIN.

    Ich habe ähnliche Tabellen, aber andere Datentypen, hier DATERANGE. Verwende PostgreSQL.

    Code:
    
    andreas@[local]:5434/test# select * from data ;
     id |         von_bis         
    ----+-------------------------
      1 | [2018-01-01,2018-04-01)
      2 | [2018-01-04,2019-01-01)
    (2 rows)
    
    andreas@[local]:5434/test# select * from monate ;
     nr |         von_bis         
    ----+-------------------------
      1 | [2018-01-01,2018-02-01)
      2 | [2018-02-01,2018-03-01)
      3 | [2018-03-01,2018-04-01)
      4 | [2018-04-01,2018-05-01)
      5 | [2018-05-01,2018-06-01)
      6 | [2018-06-01,2018-07-01)
      7 | [2018-07-01,2018-08-01)
      8 | [2018-08-01,2018-09-01)
      9 | [2018-09-01,2018-10-01)
     10 | [2018-10-01,2018-11-01)
     11 | [2018-11-01,2018-12-01)
     12 | [2018-12-01,2019-01-01)
    (12 rows)
    
    andreas@[local]:5434/test# 
    
    
    Dein Resultat bekommst nun so:

    Code:
    andreas@[local]:5434/test# select d.id, m.* from data d right join monate m on d.von_bis @> m.von_bis order by d.id, m.nr;
     id | nr |         von_bis         
    ----+----+-------------------------
      1 |  1 | [2018-01-01,2018-02-01)
      1 |  2 | [2018-02-01,2018-03-01)
      1 |  3 | [2018-03-01,2018-04-01)
      2 |  2 | [2018-02-01,2018-03-01)
      2 |  3 | [2018-03-01,2018-04-01)
      2 |  4 | [2018-04-01,2018-05-01)
      2 |  5 | [2018-05-01,2018-06-01)
      2 |  6 | [2018-06-01,2018-07-01)
      2 |  7 | [2018-07-01,2018-08-01)
      2 |  8 | [2018-08-01,2018-09-01)
      2 |  9 | [2018-09-01,2018-10-01)
      2 | 10 | [2018-10-01,2018-11-01)
      2 | 11 | [2018-11-01,2018-12-01)
      2 | 12 | [2018-12-01,2019-01-01)
    (14 rows)
    
    
    Mit Deinen Daten mußt nur die Joi-Condition etwas komplexer schreiben, das überlasse ich Dir zur Übung.

    Grüße aus (derzeit) Berlin.
     
  3. Datenbank-Neuling

    Datenbank-Neuling Neuer Benutzer

    Moin,
    wie würde denn der Join so grob aussehen? Bei einer Verknüpfung meiner Tabelle mit einer Datumstabelle über die ID würde ich es zum Beispiel nur in die Länge ziehen. Ich arbeite zur Zeit mit dem SQL Server. PostgreSQL steht nicht zur Verfügung.
     
  4. ukulele

    ukulele Datenbank-Guru

    Hier mal MSSQL als Testcode:
    Code:
    WITH tabelle(wohnung,start,ende) AS (
       SELECT 'Peter Hausnummer 11',cast('2018-01-01' AS DATE),cast('2018-03-31' AS DATE) UNION ALL
       SELECT 'Peter Hausnummer 13','2018-04-01','2018-12-31'
       ), t1(wohnung,start,ende,monatsende) AS (
       SELECT   tabelle.wohnung,
               tabelle.start,
               tabelle.ende,
               (   CASE
                   WHEN   eomonth(tabelle.start) < tabelle.ende
                   THEN   eomonth(tabelle.start)
                   ELSE   tabelle.ende
                   END )
       FROM   tabelle
       UNION ALL
       SELECT   t1.wohnung,
               dateadd(day,1,t1.monatsende),
               t1.ende,
               (   CASE
                   WHEN   eomonth(dateadd(day,1,t1.monatsende)) < t1.ende
                   THEN   eomonth(dateadd(day,1,t1.monatsende))
                   ELSE   t1.ende
                   END )
       FROM   t1
       WHERE   t1.monatsende < t1.ende
       )
    SELECT   t1.wohnung,
           t1.start,
           t1.monatsende AS ende
    FROM   t1
    ORDER BY 2,1
    OPTION (MAXRECURSION 100)
     

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