# MSSQL: Summe in Gruppierung



## rrobbyy (26. Mai 2010)

Hallo,

meine Rechere im Netzt brachte leider nicht den gewünschten Erfolg.

folgendes Problem(e):
Es exisitieren zwei Tabellen: ADRESSEN und STAOP. In der ADRESSEN sind Kunden mit ihren Daten enthalten. In STAOP liegen Information, ob Rechnungen bezahlt wurden oder nicht.

1. Ich möchte jetzt alle Kunden gruppiert nach PLZ (idealerweise Bereich 2*, 3*, etc), also eine Art Ranking, welches PLZ-Gebiet umsatzstark ist.
Folgendes Script klappt gut:


```
select a.KDNR, a.NAME, a.PLZ, b.BRUTTODM
from ADRESSEN AS a
JOIN STAOP AS b on a.KDNR = b.KUNDENNR
--GROUP BY a.PLZ
```

Wenn ich aber GROUP BY aus dem Kommentar nehme, kommt die Meldung: 

Meldung 8120, Ebene 16, Status 1, Zeile 2
Die 'ADRESSEN.KDNR'-Spalte ist in der Auswahlliste ungültig, da sie nicht in einer Aggregatfunktion und nicht in der GROUP BY-Klausel enthalten ist.

Ich bekomme es einfach nich gebacken, dass die Gruppierung akzeptiert wird.

2. Ich möchte eine Liste mit allen Kunden inkl. der aufsummierten BruttoDM-Beträge.
Dafür wollte ich die SUM-Funktion verwenden, aber die kann ich anscheinend nicht so ohne weiteres verwenden.

vor ab, vielen Dank.

PS: stört euch bitte nicht an DM, darin liegen jetzt EURO-Werte...


----------



## Nico Graichen (26. Mai 2010)

Hi


rrobbyy hat gesagt.:


> 1. Ich möchte jetzt alle Kunden gruppiert nach PLZ (idealerweise Bereich 2*, 3*, etc), also eine Art Ranking, welches PLZ-Gebiet umsatzstark ist.


Die Fehlermeldung gibt dir aber auch schon den Hinweis! 

Der Query, den du hier möchtest ist aber weniger sinnvoll, da du hier die Gruppierung auch weglassen kannst.

```
select a.KDNR, a.NAME, a.PLZ, b.BRUTTODM
from ADRESSEN AS a
JOIN STAOP AS b on a.KDNR = b.KUNDENNR
GROUP BY a.PLZ, a.KDNR, a.NAME, b.BRUTTODM
```
Ich würde dir eher folgendes vorschlagen:

```
select a.PLZ, sum(b.BRUTTODM) as sum
from ADRESSEN AS a
JOIN STAOP AS b on a.KDNR = b.KUNDENNR
GROUP BY a.PLZ
```



rrobbyy hat gesagt.:


> 2. Ich möchte eine Liste mit allen Kunden inkl. der aufsummierten BruttoDM-Beträge.
> Dafür wollte ich die SUM-Funktion verwenden, aber die kann ich anscheinend nicht so ohne weiteres verwenden.




```
select a.NAME, sum(b.BRUTTODM) as sum
from ADRESSEN AS a
JOIN STAOP AS b on a.KDNR = b.KUNDENNR
GROUP BY a.NAME
```


----------



## rrobbyy (26. Mai 2010)

supi, danke schön, klappt einwandfrei. analog hatte ich folgende lösung doch noch gedängelt:


```
SELECT KUNDENNR, SUM(BRUTTODM) as 'BRUTTO', ADRESSEN.NAME, ADRESSEN.STRASSE, ADRESSEN.PLZ, ADRESSEN.ORT
FROM STAOP
INNER JOIN ADRESSEN ON KUNDENNR = KDNR 
--WHERE ADRESSEN.PLZ like '2%'
group by KUNDENNR, ADRESSEN.NAME, ADRESSEN.STRASSE,ADRESSEN.PLZ,ADRESSEN.ORT
```

tatsächlich müssen in der gruppierung auch die spalten der select anweisung stehen. naja. wie du schon sagst, die meldung ist dahingehend recht eindeutig.


jetzt gehts aber leider weiter:
wie bekomme ich denn eine weitere Gruppierung hier rein? z.b. nach den ersten beiden PLZ-Zahlen? 
Mein Ergbnis sieht folgendermaßen aus:

PLZ        BRUTTO   FIRMA
44557	8352.33    Obstmann
48653	493.75	   Müller
49201	94477.67  Firma
55669	18965.22  Weihnachtsmann
99551	3503.03    Duck
99885	69804.51  Kowalke

gehen überhaupt mehrere gruppierungen?


----------



## Alex F. (27. Mai 2010)

rrobbyy hat gesagt.:


> jetzt gehts aber leider weiter:
> wie bekomme ich denn eine weitere Gruppierung hier rein? z.b. nach den ersten beiden PLZ-Zahlen?
> Mein Ergbnis sieht folgendermaßen aus:
> 
> ...



Ja tun Sie ich gehe jetzt mal davon aus das du auf die "beginnende PLZ" gruppieren willst 

dementsprechend 


```
Select left (PLZ,1) as PLZBereich , sum(Brutto) as Gesamtbrutto 
From Tabelle 
Group by left (PLZ,1)
```

um es einfach zu halten kannst du statt Tabelle jetzt auch dein vorheriges Ergebnis in Klammern mit alias einfügen also mit dem Beispiel von Nico



```
Select left (PLZ,1) as PLZBereich , sum(Brutto) as Gesamtbrutto 
FROM ( SELECT a.PLZ, sum(b.BRUTTODM) AS sum
              FROM ADRESSEN AS a
             JOIN STAOP AS b ON a.KDNR = b.KUNDENNR
              GROUP BY a.PLZ  ) as ErgbnisNico 
Group by left (PLZ,1)
```

Grüße Alex


----------

