SQL Query - Summieren Abhängigkeit

heinrich_c

Neuer Benutzer
Beiträge
2
Hallo Liebe Forum Mitglieder,

leider komme ich bei einer Abfrage überhaupt nicht weiter.
Ich kann mir vorstellen, dass die Antwort sehr simple sein wird, aber ich habe aktuell gar keinen Anhaltspunkt.
Folgende Struktur habe ich:

Tabelle Umsatz: Columns Kundennummer, Jahr, Umsatz, Abteilung

Die Tabelle ist bereits vollständig.
Nun habe ich zu der Tabelle eine Ansicht erstellt.

SELECT * FROM Umsatz;

Ich möchte folgendes erhalten.
Ich möchte nun in der Ansicht alle gruppierten Umsätze nach Kundennummer, Jahr und Abteilung erhalten.

Kundennummer, SUM(Umsatz gruppiert nach Abteilung und Jahr z.B. Gesamtumsatz von Vertrieb im Jahr 2018), SUM(Umsatz gruppiert nach Abteilung und Jahr z.B. Gesamtumsatz von Vertrieb im Jahr 2019), SUM(Umsatz gruppiert nach Abteilung und Jahr z.B. Gesamtumsatz von Abteilung2 im Jahr 2018), ...

Ich hoffe, dass ich mein Problem ausreichend schildern konnte.

Für Ihre Antworten bedanke ich mich im Voraus
 
Werbung:
Vielen Dank für Ihre Antwort akretschmer.
Nein hatte ich noch nie gehört. Können Sie mir bitte ein Beispiel nennen zu meinem Problem.

Mit grupping sets bekomme ich doch nicht die werte in einer zeile oder ?
 
Mit grupping sets bekomme ich doch nicht die werte in einer zeile oder ?
Tabellen sind Listen mit festen Spalten. Wenn man solche Abfragen baut, muss man sich fragen, wie ein solches Select Statement im nächsten Jahr aussieht, in 4 Wochen, im Januar 2023, 2024.
Möchte man Listenwerte, die untereinander >in einer Spalte< stehen, in mehrere Spalten transformieren, so nimmt man dazu pivot oder case when.
Wenn man sich überlegt hat, wie man die Spalten nennt, ohne dass man jedes Jahr neue Abfragen bauen muss, dann kann man loslegen.
Alternativ stellt man alle benötigten Daten in Listenform zusammen und überlässt die Pivotisierung einem Reportgenerator. Der ist deutlich flexibler mit Spaltennamen, weil die Ergebnisse eines Reports niemals weiter verarbeitet werden.
 
Werbung:
Nein hatte ich noch nie gehört. Können Sie mir bitte ein Beispiel nennen zu meinem Problem.

ohne viel Erklärung jetzt, das stammt aus einer Schulung, die ich mal bei Kundem gab:

Code:
test=*# create table umsatz (Kunde text, Monat text, Umsatz int);
CREATE TABLE
test=*# insert into umsatz select
   'Kunde ' || k::text
   , '2017/' || m.m::text
   , (random()*1000)::int
from generate_Series(1,5) k
   cross join (
select * from generate_series(1,6)) m(m);
INSERT 0 30
test=*# select * from umsatz ;
  kunde  | monat  | umsatz
---------+--------+--------
 Kunde 1 | 2017/1 |    340
 Kunde 1 | 2017/2 |    270
 Kunde 1 | 2017/3 |    130
 Kunde 1 | 2017/4 |    184
 Kunde 1 | 2017/5 |    172
 Kunde 1 | 2017/6 |    298
 Kunde 2 | 2017/1 |    864
 Kunde 2 | 2017/2 |    594
 Kunde 2 | 2017/3 |    902
 Kunde 2 | 2017/4 |    936
 Kunde 2 | 2017/5 |    508
 Kunde 2 | 2017/6 |    811
 Kunde 3 | 2017/1 |     83
 Kunde 3 | 2017/2 |     36
 Kunde 3 | 2017/3 |    659
 Kunde 3 | 2017/4 |    284
 Kunde 3 | 2017/5 |    759
 Kunde 3 | 2017/6 |    862
 Kunde 4 | 2017/1 |    915
 Kunde 4 | 2017/2 |    845
 Kunde 4 | 2017/3 |    333
 Kunde 4 | 2017/4 |    110
 Kunde 4 | 2017/5 |    443
 Kunde 4 | 2017/6 |    247
 Kunde 5 | 2017/1 |    402
 Kunde 5 | 2017/2 |    394
 Kunde 5 | 2017/3 |     33
 Kunde 5 | 2017/4 |    969
 Kunde 5 | 2017/5 |    742
 Kunde 5 | 2017/6 |    713
(30 Zeilen)

--
-- einzeln nach Kunde oder Monat gruppiert
--

test=*# select kunde, sum(umsatz) from umsatz group by kunde;
  kunde  | sum  
---------+------
 Kunde 3 | 2683
 Kunde 4 | 2893
 Kunde 1 | 1394
 Kunde 5 | 3253
 Kunde 2 | 4615
(5 Zeilen)

test=*# select monat, sum(umsatz) from umsatz group by monat;
 monat  | sum  
--------+------
 2017/5 | 2624
 2017/1 | 2604
 2017/4 | 2483
 2017/6 | 2931
 2017/3 | 2057
 2017/2 | 2139
(6 Zeilen)

--
-- nach Kunde UND Monat gruppiert
--

test=*# select kunde, monat, sum(umsatz) from umsatz group by grouping sets (kunde,(monat),());
  kunde  | monat  |  sum  
---------+--------+-------
 Kunde 1 |        |  1394
 Kunde 2 |        |  4615
 Kunde 3 |        |  2683
 Kunde 4 |        |  2893
 Kunde 5 |        |  3253
         |        | 14838
         | 2017/1 |  2604
         | 2017/2 |  2139
         | 2017/3 |  2057
         | 2017/4 |  2483
         | 2017/5 |  2624
         | 2017/6 |  2931
(12 Zeilen)

--
-- ROLLUP
--

test=*# select kunde, monat, sum(umsatz) from umsatz group by rollup (kunde,monat);
  kunde  | monat  |  sum  
---------+--------+-------
 Kunde 1 | 2017/1 |   340
 Kunde 1 | 2017/2 |   270
 Kunde 1 | 2017/3 |   130
 Kunde 1 | 2017/4 |   184
 Kunde 1 | 2017/5 |   172
 Kunde 1 | 2017/6 |   298
 Kunde 1 |        |  1394
 Kunde 2 | 2017/1 |   864
 Kunde 2 | 2017/2 |   594
 Kunde 2 | 2017/3 |   902
 Kunde 2 | 2017/4 |   936
 Kunde 2 | 2017/5 |   508
 Kunde 2 | 2017/6 |   811
 Kunde 2 |        |  4615
 Kunde 3 | 2017/1 |    83
 Kunde 3 | 2017/2 |    36
 Kunde 3 | 2017/3 |   659
 Kunde 3 | 2017/4 |   284
 Kunde 3 | 2017/5 |   759
 Kunde 3 | 2017/6 |   862
 Kunde 3 |        |  2683
 Kunde 4 | 2017/1 |   915
 Kunde 4 | 2017/2 |   845
 Kunde 4 | 2017/3 |   333
 Kunde 4 | 2017/4 |   110
 Kunde 4 | 2017/5 |   443
 Kunde 4 | 2017/6 |   247
 Kunde 4 |        |  2893
 Kunde 5 | 2017/1 |   402
 Kunde 5 | 2017/2 |   394
 Kunde 5 | 2017/3 |    33
 Kunde 5 | 2017/4 |   969
 Kunde 5 | 2017/5 |   742
 Kunde 5 | 2017/6 |   713
 Kunde 5 |        |  3253
         |        | 14838
(36 Zeilen)

--
-- CUBE
--

test=*# select kunde, monat, sum(umsatz) from umsatz group by cube (kunde,monat);
  kunde  | monat  |  sum  
---------+--------+-------
 Kunde 1 | 2017/1 |   340
 Kunde 1 | 2017/2 |   270
 Kunde 1 | 2017/3 |   130
 Kunde 1 | 2017/4 |   184
 Kunde 1 | 2017/5 |   172
 Kunde 1 | 2017/6 |   298
 Kunde 1 |        |  1394
 Kunde 2 | 2017/1 |   864
 Kunde 2 | 2017/2 |   594
 Kunde 2 | 2017/3 |   902
 Kunde 2 | 2017/4 |   936
 Kunde 2 | 2017/5 |   508
 Kunde 2 | 2017/6 |   811
 Kunde 2 |        |  4615
 Kunde 3 | 2017/1 |    83
 Kunde 3 | 2017/2 |    36
 Kunde 3 | 2017/3 |   659
 Kunde 3 | 2017/4 |   284
 Kunde 3 | 2017/5 |   759
 Kunde 3 | 2017/6 |   862
 Kunde 3 |        |  2683
 Kunde 4 | 2017/1 |   915
 Kunde 4 | 2017/2 |   845
 Kunde 4 | 2017/3 |   333
 Kunde 4 | 2017/4 |   110
 Kunde 4 | 2017/5 |   443
 Kunde 4 | 2017/6 |   247
 Kunde 4 |        |  2893
 Kunde 5 | 2017/1 |   402
 Kunde 5 | 2017/2 |   394
 Kunde 5 | 2017/3 |    33
 Kunde 5 | 2017/4 |   969
 Kunde 5 | 2017/5 |   742
 Kunde 5 | 2017/6 |   713
 Kunde 5 |        |  3253
         |        | 14838
         | 2017/1 |  2604
         | 2017/2 |  2139
         | 2017/3 |  2057
         | 2017/4 |  2483
         | 2017/5 |  2624
         | 2017/6 |  2931
(42 Zeilen)

Bitte besorg Dir Literatur dazu, die gibt es massig.

Das ist mit PostgreSQL gemacht, kann M$SQL evtl. auch und vielleicht sogar ähnlich.
 
Zurück
Oben