SQL Statistik per SQL-Abfrage erstellen?

Dsimon24

Lieutenant
Registriert
Aug. 2016
Beiträge
595
Hallo zusammen,

ich versuche gerade eine Statistik über eine SQL-Abfrage zu erstellen,
habe aber noch keine Idee, wie ich vorgehen kann, um ein Ergebnis
zu erhalten. - Vielleicht kann mir einer helfen!?

Ich habe eine Datenbank, die in etwa folgendermaßen ausschaut:
img_167.jpg

Jetzt hätte ich gerne eine Übersicht, mit dem folgendem Inhalt:
Summe der Eintragungen in der Datenbank der einzelnen Tage,
unterteilt in den jeweiligen Regionen. Beispiel:

20.08.2017 / 3 Eintragungen / davon 1x Reg. Ost, 2x Reg. Nord
...
...
...
10.09.2017 / 3 Eintragungen / davon 1x West, 1x Nord, 1x Ost

Wie kann ich sowas realisieren?

VG, David
 
Ich weiß nicht, ob du das in eine Zeile bekommst.

Aber ein SELECT datum, region, COUNT(datum) FROM xxx GROUP BY datum, region; hat schonmal 50% der Anforderung erfüllt :D
 
Das hängt auch von der verwendeten DB ab. In MySQL funktioniert beispielsweise folgendes:
Code:
SELECT datum, COUNT(datum), SUM(region='Ost') AS ost, SUM(region='West') AS west, SUM(region='Nord') AS nord
FROM xxx
GROUP BY datum 
ORDER BY datum DESC

Das funktioniert, weil MySQL false und true als 0 und 1 interpretiert.
 
Zuletzt bearbeitet:
Andreas_ schrieb:
Das hängt auch von der verwendeten DB ab. In MySQL funktioniert beispielsweise folgendes:
Code:
SELECT datum, COUNT(datum), SUM(region='Ost') AS ost, SUM(region='West') AS west, SUM(region='Nord') AS nord
FROM xxx
GROUP BY datum 
ORDER BY datum DESC

Das funktioniert, weil MySQL false und true als 0 und 1 interpretiert.

Das funktioniert sehr gut - vielen Dank!
Jetzt habe ich gesehen, dass ich noch mehrere Regionen in der DB habe.
Wie kann ich denn herausfinden, welche Regionen alles in der DB stehen?
 
SELECT DISTINCT region
FROM XXX
 
Nicht? Vielleicht überseh ich ja grad was - gut möglich -- aber ich würd zumindest erstmal schauen, ob ein GROUP BY ROLLUP(datum, region) nicht das liefert, was ich wollte.
 
RalphS schrieb:
Nicht? Vielleicht überseh ich ja grad was - gut möglich -- aber ich würd zumindest erstmal schauen, ob ein GROUP BY ROLLUP(datum, region) nicht das liefert, was ich wollte.

Da hätte er aber je Datum eine variable Anzahl von Ergebniszeilen, das entspricht eher nicht der Anforderung wie ich sie aus dem Ausgangspost herauslese.
 
Aber doch nur, wenn für den Tag in der Region kein Umsatz da war. Dann ist das 0.

Kann wirklich sein, daß ich das falsch verstanden hab. Daher kurz erläutert:

- Eine Abfrage nach dem Schema
Code:
SELECT datum, region, SUM(umsatz) umsatzsumme GROUP BY ROLLUP(datum, region) ORDER BY datum;
(was nicht notwendigerweise MySQL-Syntax entspricht) würde in etwa so etwas liefern:
Code:
datum | region | umsatzsumme
01.01.1980 Nord 25
01.01.1980 Süd  50
01.01.1980 West 75
01.01.1980 Ost 100
01.01.1980 NULL 250
01.02.1980 Nord 10
01.02.1980 Süd 20
01.02.1980 West 30
01.02.1980 Ost 40
01.02.1980 NULL 100
--
-- weitere Zeilen
--
NULL NULL 350
wobei jede der Spalte datum und region mit Werten darin in Umsatzsumme pro Tag und Region aufsummiert (SUM()) und dann, wegen ROLLUP(), von links nach rechts nochmal zusammengefaßt wird (also "pro Tag" an dieser Stelle). Abschließend gibt es noch ein Gesamtergebnis. Vereinfacht: Da wo NULL steht, ist die Spalte aus der Zusammenfassung rausgefallen und nur die anderen wurden berücksichtigt.

Damit erhält man also eine Auflistung "pro Tag und Region", "pro Tag" und "Gesamt", entsprechend der gewählten Aggregatfunktion.

Wenn das nicht so gewünscht war, dann braucht man das natürlich nicht so zu machen. :)
 
Sie würde aber auch so etwas liefern (Die Anzahl der Ergebniszeilen je Datum ist variabel, da nicht zu jedem Datum Umsätze in jeder Region getätigt werden):
Code:
datum | region | umsatzsumme
01.01.1980 Nord 25
01.01.1980 NULL 25
01.02.1980 Süd 20
01.02.1980 Ost 40
01.02.1980 NULL 60
01.03.1980 Nord 25
01.03.1980 Süd  50
01.03.1980 West 75
01.03.1980 Ost 100
01.03.1980 NULL 250
--
-- weitere Zeilen
--
NULL NULL 335

Ich habe nicht bestritten, dass dort alle geforderten Ergebnisse enthalten sind, es gibt nur in diesem Fall eine Lösung, deren Ergebnisse einfacher darstellbar sind und die der Vorgabe ein Datensatz je Datum aus dem Eingangspost entspricht.

Code:
datum | umsatzsumme | Nord | Süd | West | Ost
01.01.1980 25 25 0 0 0
01.02.1980 60 0 20 0 40
01.03.1980 250 25 50 75 100

Deswegen würde ich BY ROLLUP in diesem Fall nicht verwenden ...
 
Zuletzt bearbeitet:
Zurück
Oben