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

Abfrage nach Tagen

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von DirkMeier.Menden, 2 September 2014.

  1. DirkMeier.Menden

    DirkMeier.Menden Benutzer

    Hallo liebe Datenbank- Gemeinde,

    ich habe eine Warenwirtschaft auf MS-SQL Basis und arbeite mit SQL Server 2008R2.
    Da mir einige für mich wichtige Funktionen in der Warenwirtschaft fehlen, versuche ich einige Auswertungen selber zu generieren. Ich kenne nur wenige Funktionen in SQL und hoffe jemand kann mir weiter helfen.

    Ich habe eine select Anweisung geschrieben die mir den Umsatz des jetzigen Tagesdatum auswirft.

    SELECT Artikelnummer, Bezeichnung, SUM(Menge) AS Menge
    FROM Journal
    WHERE (Datum > GETDATE() - 1)
    GROUP BY Artikelnummer, Bezeichnung

    Ich bräuchte aber noch den Umsatz von gestern, dann von vorgestern...

    Wenn ich den Zähler nach GETDATE() höhersetze z.B. auf -2 bekomme ich die Umsätze der letzten 2 Tage was aber nicht gewollt ist.
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Dann vergleiche nicht auf das, was GRÖßER als heute -2 ist, sondern was GLEICH heute -2 ist.
     
  3. DirkMeier.Menden

    DirkMeier.Menden Benutzer

    Habe ich versucht, aber dann werden keine Ergebnisse ausgegeben
     
  4. akretschmer

    akretschmer Datenbank-Guru

    works for me:

    Code:
    test=*# select '2014-08-25'::date + s * '1day'::interval as datum from generate_series(0,10) s;  datum
    ---------------------
     2014-08-25 00:00:00
     2014-08-26 00:00:00
     2014-08-27 00:00:00
     2014-08-28 00:00:00
     2014-08-29 00:00:00
     2014-08-30 00:00:00
     2014-08-31 00:00:00
     2014-09-01 00:00:00
     2014-09-02 00:00:00
     2014-09-03 00:00:00
     2014-09-04 00:00:00
    (11 rows)
    
    Time: 0,251 ms
    test=*# select * from (select '2014-08-25'::date + s * '1day'::interval as datum from generate_series(0,10) s) foo where datum > current_date - 5;
      datum
    ---------------------
     2014-08-29 00:00:00
     2014-08-30 00:00:00
     2014-08-31 00:00:00
     2014-09-01 00:00:00
     2014-09-02 00:00:00
     2014-09-03 00:00:00
     2014-09-04 00:00:00
    (7 rows)
    
    Time: 0,347 ms
    test=*# select * from (select '2014-08-25'::date + s * '1day'::interval as datum from generate_series(0,10) s) foo where datum = current_date - 5;
      datum
    ---------------------
     2014-08-28 00:00:00
    (1 row)
    
     
  5. DirkMeier.Menden

    DirkMeier.Menden Benutzer

    Tut mir leid, verstehe ich nicht. Kannst du mir das erklären?
    Bin Neuling.
     
  6. akretschmer

    akretschmer Datenbank-Guru

    Das erste Select erzeugt eine Tabelle mit Datumswerten. In den anderen Abfragen steht jeweisl diese Abfrage innerhalb der Klammern und wird als foo bezeichnet, der Rest drum herum sind jeweils normale Abfragen dann auf diese virtuelle foo - Tabelle mit unterschiedlichen Where-Conditions.
     
  7. ukulele

    ukulele Datenbank-Guru

    Ich würde das erstmal nur mit einem klassischen GROUP BY nach Datum abbilden, vieleicht hilft dir das schon weiter.
    Code:
    SELECT    cast(cast(Datum AS INT) AS DATETIME) AS Datum,
            Artikelnummer,
            Bezeichnung,
            sum(Menge) AS Menge
    FROM    Journal
    WHERE    Datum >= cast(cast(getdate() AS INT) -3 AS DATETIME)
    GROUP BY cast(cast(getdate() AS INT) AS DATETIME),
            Artikelnummer,
            Bezeichnung
    Ich habe sicherheitshalber die Datumsspalte (durch Umwandlung in INT und zurück in DATETIME) um ihren Zeitanteil gekürzt. Wenn du keinen Zeitanteil in der Spalte hast bzw. der immer 0 ist kannst du dir das sparen.

    Im Gegensatz zu akretschmers Lösung (die aber auf MSSQL so nicht funktioniert) liefert meine Abfrage allerdings nur Werte, wenn auch welche vorhanden sind. Wenn Gestern Sonntag war und keine Mengen entstanden sind wird diese Zeile komplett fehlen.
     
  8. DirkMeier.Menden

    DirkMeier.Menden Benutzer

    Hallo akretschmer,

    vielen Dank für die Erklärungen
     
  9. DirkMeier.Menden

    DirkMeier.Menden Benutzer

    Hallo Ukulele,

    ich habe jetzt die Abfrage wie vorgeschlagen erstellt,

    SELECT CAST(CAST(Datum AS INT) AS DATETIME) AS Datum,
    Artikelnummer,
    Bezeichnung,
    SUM(Menge) AS Summe​
    FROM Journal
    GROUP BY CAST(CAST(Datum AS INT) AS DATETIME),
    Artikelnummer,
    Bezeichnung,​
    HAVING CAST(CAST(Datum AS INT) AS DATETIME) >= CAST(CAST(Datum AS INT) AS DATETIME) -3)

    Beim Datum ist jetzt wie gewollt auch der Zeitstempel weg also in jedem Datumsfeld 00:00:000,
    bei der Auswertung wird aber jeder Artikel seit Beginn der Datenaufzeichnung angezeigt, wenn ich das > Zeichen entferne wird kein Artikel angezeigt. Also wie vorher auch.
    Habe ich etwas falsch gemacht?
     
  10. ukulele

    ukulele Datenbank-Guru

    Erstmal arbeitest du mit HAVING statt mit WHERE. Das ist jetzt nicht das Problem aber eigentlich ist WHERE hier eher angebracht.

    Dann steht in deiner Bedingung im wesentlichen (mal ohne Konvertierung)
    Spalte >= Spalte -3
    es soll aber vermutlich eher
    Spalte >= Heute -3
    sein. Ich hatte auch getdate() an der entsprechenden Stelle eingesetzt.
     
  11. DirkMeier.Menden

    DirkMeier.Menden Benutzer

    Stimmt, wer richtig lesen kann ist klar im Vorteil, danke für den Hinweis.

    "Erstmal arbeitest du mit HAVING statt mit WHERE. Das ist jetzt nicht das Problem aber eigentlich ist WHERE hier eher angebracht."

    HAVING anstatt WHERE weil bei mir in einer GROUP- Anweisung WHERE nicht funktioniert.

    Ich werde es noch einmal neu ausprobieren.
     
  12. ukulele

    ukulele Datenbank-Guru

    WHERE muss funktionieren.
     
  13. DirkMeier.Menden

    DirkMeier.Menden Benutzer

    Stimmt, WHERE funktioniert.

    Ich bekomme allerdings folgende Meldung:

    Jeder GROUP BY-Ausdruck muss mindestens eine Spalte enthalten, die kein äußerer Verweis ist.

    Wenn ich den GROUP BY Ausdruck weglasse und die Summe in der Menge bekomme ich Artikel aufgelistet allerdings mit Daten der letzten 3 Tage aber auch Artikel vom Folgetag das heißt Auswertetag 04.09.2014, Auflistung von Artikel vom 02.09 bis 05.09,2014, was ja nicht stimmen kann.

    Wenn ich das > Zeichen von >= weglasse werden keine Daten angezeigt.

    Liegt das am fehlenden GROUP BY Befehl?
     
  14. DirkMeier.Menden

    DirkMeier.Menden Benutzer

    Ich habe herausgefunden dass wenn man in dem GROUP BY Ausdruck
    cast(cast(getdate() AS INT) AS DATETIME)
    das getdate austauscht
    cast(cast(Datum AS INT) AS DATETIME)
    die Abfrage ausgeführt wird, die anderen Probleme bleiben allerdings.
     
  15. ukulele

    ukulele Datenbank-Guru

    Ich weiß nicht genau was du da alles probierst aber diese Abfrage sollte unverändert laufen sofern die Spaltennamen richtig sind.

    Sie liefert alle Zeilen bei denen das Datum bei Jetzt - 3 Tage um 0 Uhr oder darüber liegt, also theoretisch auch Morgen, und gruppiert diese.
     
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