SQL: Eintragen fehlender Datumsangaben

Aus DBWiki
Wechseln zu: Navigation, Suche

Zurück zur Übersicht



Durch Pivotisierung des Zeitbereichs und einem OUTER JOIN lassen sich fehlende Datumsangaben erheischen.


Es soll z.B. für jeden Monat der Jahre 1981 und 1982 aufgelistet werden, wieviele Einstellungen stattgefunden haben.

Lösung für Jet-SQL

Hinweis für Access-Anwender
Um die folgenden Abfragen selbst testen zu können, müssen die Tabellen der Übungsdatenbank sowie die Pivottabelle t1000 vorhanden sein.

Um die Lösung übersichtlich zu halten, verwenden wir im Weiteren eine Abfrage vw_eingestellt_8182.

SELECT eingestellt
FROM   mitarbeiter
WHERE  eingestellt BETWEEN #1991-01-01# And #1981-12-31#
SELECT Format$( min_ed, 'yyyy-mm' ) AS jahr_monat,
       Count( eingestellt ) AS anz_eingestellt
FROM   ( SELECT DateAdd( 'm', n, a.min_ed) AS min_ed
         FROM   ( SELECT Min( DateSerial( Year( eingestellt ),  1, 1 ) ) AS min_ed,
                         Max( DateSerial( Year( eingestellt ), 12, 1 ) ) AS max_ed
                  FROM   vw_eingestellt_8182 ) AS a,
                         t1000
                  WHERE DateAdd( 'm', n, min_ed ) <= max_ed ) AS b 
       LEFT JOIN vw_eingestellt_8182 AS c
              ON b.min_ed = DateSerial( Year( c.eingestellt ), Month( c.eingestellt ), 1 )
GROUP  BY Format$(min_ed, 'yyyy-mm' )

Lösung für PostgreSQL

WITH a AS (
    SELECT ( EXTRACT( YEAR FROM age( max_januar, min_januar ) ) * 12 - 1 )::INTEGER AS monate            -- Anzahl der fehlenden Monate
    FROM   ( SELECT date_trunc( 'YEAR', MIN( eingestellt ) )::DATE AS min_januar,                        -- 1. Jan des ältesten Jahres
                    ( date_trunc( 'YEAR', MAX( eingestellt ) ) + INTERVAL '1 YEAR' )::DATE AS max_januar -- 1. Jan des jüngsten Jahres
             FROM   vw_eingestellt_8182 ) AS a0 ),
     b AS (
    SELECT date_trunc( 'YEAR', MIN( eingestellt ) )::DATE AS start_dt  -- 1. Januar des altesten Jahres
    FROM   vw_eingestellt_8182 ),
     c AS (
    SELECT (start_dt + id * INTERVAL '1 MONTH')::DATE  AS monat        -- 1. des nächsten Monats anlegen
    FROM   a, b, generate_series( 0, monate ) AS x( id ) )             -- id von 0 - Anzahl der Monate erzeugen
SELECT to_char( monat, 'yyyy-mm' ) AS jahr_monat,                      -- Ausgabe formatieren
       COUNT( eingestellt ) AS anz_eingestellt                         -- Einstellungen zählen
FROM   c
       LEFT JOIN vw_eingestellt_8182 AS d
              ON ( c.monat = date_trunc( 'MONTH', d.eingestellt ) )    -- über den Monatsersten verknüpfen
GROUP  BY 1
ORDER  BY 1
jahr_monat anz_eingestellt
1981-01 0
1981-02 3
1981-03 0
1981-04 1
1981-05 1
1981-06 1
1981-07 0
1981-08 0
1981-09 2
1981-10 0
1981-11 1
1981-12 2
1982-01 1
1982-02 0
1982-03 0
1982-04 0
1982-05 0
1982-06 0
1982-07 0
1982-08 0
1982-09 0
1982-10 0
1982-11 0
1982-12 0



Zurück zur Übersicht