(Historien) Dimensionstabelle mit SQL vervollständigen

Mr. Robot

Fleissiger Benutzer
Beiträge
88
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
 
Werbung:
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.
 
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.
 
Werbung:
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)
 
Zurück
Oben