Rechnen und Gruppieren in SQL Abfrage

Don-DCH

Captain
Registriert
Aug. 2009
Beiträge
3.256
Guten Abend zusammen,

ich bin schon länger am rumprobieren und komme einfach nicht weiter :/

Vielleicht hat jemand eine Idee, ich habe extra mal ein Schaubild angefertigt :)

ArtikelAnzahlThema
Shampoo20Drogerie
Zahnpasta10Drogerie
Paprika2Essen
Salami3Essen


Ich möchte folgende Ausgabe Erreichen:

ThemaAnzahl
Drogerie30
Essen5

Sprich alle Themen einmal aufgelistet und dort die Gesamtanzahl der Artikel summiert haben.
Leider komme ich nichtweiter, anbei die Abfrage die ich gebastelt habe:

SELECT Tabellenname.Anzahl,
Tabellenname.Thema
SUM(Anzahl*'Thema')
FROM Tabellenname
GROUP BY Tabellenname.Thema

Vielleicht weiß jemand Rat :)

Viele Grüße und ein schönes Wochenende zusammen :)
 
Keine Hausaufgabe, Schule ist doch etwas her :)
Kleine Maria Datenbank pivat/hobby

Mit Count habe ich es versucht, da bekomme ich aber nur die Anzahl der Themen zusammengezählt aber ohne die Anzahl des jeweiligen Artikels

SELECT Tabellenname.Thema, COUNT(*)
FROM Tabellenname
GROUP BY Tabellenname.Thema

Auch nicht verwunderlich, da ich Anzahl nicht mit drinne hab aber wo pack ich das rein, das es nicht zu einem Fehler kommt :) ?
 
SQL:
SELECT Tabellenname.Thema,
SUM(Tabellenname.Anzahl) as Anzahl
FROM Tabellenname
GROUP BY Tabellenname.Thema
order by Tabellenname.Thema

Das sollte es tun, denke ich.
 
  • Gefällt mir
Reaktionen: Oelepoeto und Don-DCH
SUM ist schon richtig, aber entweder steh ich auf dem Schlauch oder keine Ahnung, weil...

SQL:
SELECT Thema, SUM(Anzahl) 
GROUP BY Thema

sollte doch eigentlich liefern, oder nicht? :confused_alt:

Exakt dafür ist doch GROUP BY da, sonst könnte man sich das doch sparen?
 
  • Gefällt mir
Reaktionen: Don-DCH
Code:
Bitte Code immer in Code packen

Mein SQL ist etwas eingerostet, aber
Code:
SELECT Tabellenname.Thema, COUNT(Tabellenname.Thema) as Anzahl
FROM Tabellenname
GROUP BY Tabellenname.Thema

Jurial war schneller, aber man braucht kein ORDER und GROUP BY gleichzeitig.

Man könnte aber noch ein ORDER BY COUNT(Tabellenname.Thema) [DESC|ASC] einbauen.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Don-DCH
Removed.
Post war ein Fehler. Sorry , bin am Handy ohne SQL Servwr
 
Zuletzt bearbeitet:
PHuV schrieb:
aber man braucht kein ORDER und GROUP BY gleichzeitig.

Man könnte aber noch ein ORDER BY COUNT(Tabellenname.Thema) [DESC|ASC] einbauen.
Schon richtig, ein ORDER BY braucht man nur, falls man möchte, dass das gruppierte Endergebnis immer die gleiche Sortierung hat.

LencoX2 schrieb:
Fast richtig.
SQL:
SELECT Thema, SUM(Anzahl)
GROUP BY Thema, anzahl

Da fehlt doch das from table und man will doch nicht nach anzahl gruppieren. Im Beispiel vom TE erhielte man dann ja wieder 4 Zeilen als Ergebnis?!
 
Vielen Herzlichen Dank euch!

Die Abfrage von @Jurial und @RalphS liefert das gewünschte Ergebnis, ich werde nochmal Stichproben weise die Anzahl schnell chekcen aber das schaut sehr gut aus :)

Die Query von @LencoX2 gibt mehrmals die Themen aus, ich denke mal je nach dem wie oft unterschiedliche Anzahl bei den Artikeln ist kommt eine Zeile da rein.

Nochmals vielen herzlichen Dank euch!
Besonders klasse fand ich es, wenn ich das richtig sehe, dass @Jurial sich extra angemeldet hat um zu helfen :) großes Dankeschön euch und ein schönes Wochenende :)
 
  • Gefällt mir
Reaktionen: Jurial
Nur der Klarstellung wegen:
1. Count hilft hier gar nichts. COUNT zählt meine Zeilen. Wenn ich für jede "Anzahl" einen Record hätte, also z.B. Benutzerkonten in einer USERS Tabelle, dann könnte ich die mit COUNT() zählen und mit Hilfe von GROUP BY oder einer Fensterfunktion strukturieren.

2. GROUP BY und ORDER BY braucht man tatsächlich nicht notwendigerweise zusammen, ABER wenn ich gruppiere habe KEINE Ordnung auf dem Ergebnis. GROUP BY macht das nicht für mich. Wenn ich mein gruppiertes Ergebnis sortiert haben will, dann (und nur dann) brauche ich ORDER BY natürlich zusätzlich.

3. Für numerische Aggregate zusätzlich aufpassen, wenn eine aggregierte Spalte auch NULL annehmen kann. COALESCE(spalte,0) kann hier helfen.

Das zu recherchierende Stichwort ist Aggregatfunktion. Die hat man hauptsächlich in Verbindung mit GROUP BY, punktuell aber auch "entartet" ohne.
Die zugrundeliegende Idee ist:

1. Erstelle über die gesamte Tabelle eine Struktur in der Form, daß die Datenstruktur, die ich in GROUP BY angegeben habe, exakt EIN (1) mal vorkommt.

2. Alle anderen Spalten, die ich dort nicht angegeben habe, werden entweder verworfen oder werden aggregiert. Für letzteres muß ich dieses Aggregat in SELECT angeben. Spalten in SELECT, die nicht in GROUP BY enthalten sind, sind daher unzulässig (ja, auch in MySQL).

3. Aggregat in diesem Zusammenhang bedeutet, daß meine Aggregatfunktion bezogen auf den Ergebnisdatensatz die Werte der aggregierten Spalte zusammenfaßt. Dafür ist das da.

SQL:
SELECT COUNT(*) FROM Adressen
zählt die vorhandenen Adressen in der Tabelle.
Hänge ich noch einen Ort an:
SQL:
SELECT COUNT(*), Ort FROM Adressen GROUP BY Ort
dann erhalte ich die Verteilung der Adressen über die Orte, will heißen, ich erfahre, wieviele Spalten es gibt mit exakt DIESEM "Ort". COUNT() zählt diese für mich.

SUM() summiert halt die enthaltenen Werte. AVG würde den Durchschnitt bestimmen. Beide erfordern offensichtlich numerische Spalten - im Gegensatz zu COUNT.

Aber immer in Bezug auf den Ergebnisdatensatz. Mit
SQL:
SELECT COUNT(*), PLZ, Ort FROM Adressen GROUP BY PLZ, Ort
bekomme ich andere Ergebnisse.
 
  • Gefällt mir
Reaktionen: Oelepoeto
Zurück
Oben