none
Fehlende Datum in SQL_Tabelle ergänzen RRS feed

  • Frage

  • Hallo Zusammen,
    ich kenne mich nicht mit Sql_Pragrammierung. Ich habe eine Frage und hoffe, dass mir jemand weiterhelfen kann. Ich habe eine SQL Abfrage bekommen. Hierzu lierfert meine Sql Abfrage eine tabelle mit datum und Anzahl

    Datum           :        Anzahl
    2015-01-15            68
    2015-01-16            44
    2015-01-19            16
    2015-01-20            98
    2015-01-21            47
    2015-01-22            50
    2015-01-21             1   

    Wie kann ich meiner SQL_Abfrage ergänzen, damit die fehlende datum(hier ZB: 2015-01-17 und 2015-01-18 ) eingefügt werden und mit 0 ausfüllen.

    so habe ich die Sql Abfrage bekommen

    USE BarForce SELECT CONVERT(date, ProductionDate) AS Datum, COUNT(CONVERT(date, ProductionDate)) As Anzahl FROM Slitte WHERE ProductionDate IS NOT NULL GROUP BY CONVERT(date, ProductionDate) ORDER BY CONVERT(date, ProductionDate)

    Dake für eure Hilfe


    • Bearbeitet Matsak Freitag, 23. Januar 2015 10:46
    Freitag, 23. Januar 2015 10:45

Antworten

  • Hallo,

    wie Andreas schon schrieb, brauchst Du eine Tabelle mit allen benötigten Datumswerten, am besten persistiert, ansonsten kann man auch per CTE = Common Table Expression diese Daten on-the fly erzeugen, Beispiel:

    ;with dates as
        (SELECT CONVERT(date, '2015-01-01', 120) AS Datum
         UNION ALL
         SELECT DATEADD(day, 1, Datum) AS Datum
         FROM dates
         WHERE Datum < CONVERT(date, '2015-12-31', 120))
    , deineDaten as
        ( SELECT CONVERT(date, '2015-01-15') AS Datum, 68 AS Anzahl
          UNION ALL SELECT CONVERT(date, '2015-01-16'), 44
          UNION ALL SELECT CONVERT(date, '2015-01-19'), 16
          UNION ALL SELECT CONVERT(date, '2015-01-20'), 98
          UNION ALL SELECT CONVERT(date, '2015-01-21'), 47
          UNION ALL SELECT CONVERT(date, '2015-01-22'), 50
          UNION ALL SELECT CONVERT(date, '2015-01-21'), 1)
    
    SELECT dates.Datum, ISNULL(deineDaten.Anzahl, 0) AS Anzahl
    FROM dates
         LEFT JOIN
         deineDaten ON dates.Datum = deineDaten.Datum
    OPTION (Maxrecursion 366)

    Liefert

    Datum	        Anzahl
    2015-01-01	0
    2015-01-02	0
    2015-01-03	0
    2015-01-04	0
    2015-01-05	0
    2015-01-06	0
    2015-01-07	0
    2015-01-08	0
    2015-01-09	0
    2015-01-10	0
    2015-01-11	0
    2015-01-12	0
    2015-01-13	0
    2015-01-14	0
    2015-01-15	68
    2015-01-16	44
    2015-01-17	0
    2015-01-18	0
    2015-01-19	16
    2015-01-20	98
    2015-01-21	47


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    • Als Antwort markiert Matsak Montag, 26. Januar 2015 08:34
    Samstag, 24. Januar 2015 08:43

Alle Antworten

  • Hallo

    am einfachsten macht sich soetwas mithilfe einer Datumstabelle, wie man sie in praktisch allen Datawarehouses hat.

    Wenn es so eine noch nicht gibt, würde ich mir jetzt eine solche anlegen - man kann diese immer wieder mal gebrauchen.

    Dann ist es ein simples Left Outer Join. :)


    Andreas Wolter (Blog | Twitter)
    MCSM: Microsoft Certified Solutions Master Data Platform, MCM, MVP
    www.SarpedonQualityLab.com | www.SQL-Server-Master-Class.com

    • Als Antwort vorgeschlagen Olaf HelperMVP Samstag, 24. Januar 2015 09:10
    Freitag, 23. Januar 2015 16:09
  • Hallo,

    wie Andreas schon schrieb, brauchst Du eine Tabelle mit allen benötigten Datumswerten, am besten persistiert, ansonsten kann man auch per CTE = Common Table Expression diese Daten on-the fly erzeugen, Beispiel:

    ;with dates as
        (SELECT CONVERT(date, '2015-01-01', 120) AS Datum
         UNION ALL
         SELECT DATEADD(day, 1, Datum) AS Datum
         FROM dates
         WHERE Datum < CONVERT(date, '2015-12-31', 120))
    , deineDaten as
        ( SELECT CONVERT(date, '2015-01-15') AS Datum, 68 AS Anzahl
          UNION ALL SELECT CONVERT(date, '2015-01-16'), 44
          UNION ALL SELECT CONVERT(date, '2015-01-19'), 16
          UNION ALL SELECT CONVERT(date, '2015-01-20'), 98
          UNION ALL SELECT CONVERT(date, '2015-01-21'), 47
          UNION ALL SELECT CONVERT(date, '2015-01-22'), 50
          UNION ALL SELECT CONVERT(date, '2015-01-21'), 1)
    
    SELECT dates.Datum, ISNULL(deineDaten.Anzahl, 0) AS Anzahl
    FROM dates
         LEFT JOIN
         deineDaten ON dates.Datum = deineDaten.Datum
    OPTION (Maxrecursion 366)

    Liefert

    Datum	        Anzahl
    2015-01-01	0
    2015-01-02	0
    2015-01-03	0
    2015-01-04	0
    2015-01-05	0
    2015-01-06	0
    2015-01-07	0
    2015-01-08	0
    2015-01-09	0
    2015-01-10	0
    2015-01-11	0
    2015-01-12	0
    2015-01-13	0
    2015-01-14	0
    2015-01-15	68
    2015-01-16	44
    2015-01-17	0
    2015-01-18	0
    2015-01-19	16
    2015-01-20	98
    2015-01-21	47


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    • Als Antwort markiert Matsak Montag, 26. Januar 2015 08:34
    Samstag, 24. Januar 2015 08:43
  • Hallo,

    Vielen Danke für Ihre Hilfe.

    Montag, 26. Januar 2015 08:36