Abfrage nach Tagen

DirkMeier.Menden

Benutzer
Beiträge
10
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.
 
Werbung:
Habe ich versucht, aber dann werden keine Ergebnisse ausgegeben

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)
 
Tut mir leid, verstehe ich nicht. Kannst du mir das erklären?
Bin Neuling.

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.
 
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.
 
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?
 
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.
 
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.
 
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?
 
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.
 
Werbung:
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 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.
 
Zurück
Oben