| Autor |
SQL: group by |
|
hingiswiss
Aktiv  Dabei seit: 02.04.2005 Mitteilungen: 428
Aus:
 |     Themenstart: 2012-08-19 04:40
|
Hallo zusammen,
ich habe gerade meinen Rechner mit einer DBMS bei meinem Bruder, kann deshalb nicht testen. Eine Frage:
ID KundenID Beschreibung Betrag
1 33 Ersatzgebühr 40
2 33 Mitgliederbeitrag 50
3 45 Mitgliederbeitrag 50
4 33 Mahngebühr 65
5 35 Kaution 20
6 59 Ersatzgebühr 40
7 45 Mahngebühr 80
8 45 Ersatzgebühr 40
Was würde mir SQL ausgeben bei dem Code?
SELECT KundenID, Beschreibung
FROM Kasseneinnahmen
GROUP BY KundenID;
Vielen Dank für die Hilfe.
Schöne Grüße aus Rheinland,
Eure Ratna
|
Profil
Quote
Link |
Buri
Senior  Dabei seit: 02.08.2003 Mitteilungen: 34706
Aus: Dresden
 |     Beitrag No.1, eingetragen 2012-08-19 08:47
|
Hi hingiswiss,
soweit ich sehe, ist die GROUP BY-Klausel in diesem Beispiel wirkungslos oder unzulässig, weil keine Aggregatfunktionen vorkommen und weil alle Paare von (KundenID, Beschreibung) verschieden sind.
Microsoft Access liefert die Fehlermeldung
Sie wollten eine Abfrage ausführen, die den angegebenen Ausdruck "Beschreibung" nicht als Teil der Aggregatfunktion einschließt.
Anders wäre es, wenn zum Beispiel mehrere Datensätze "33 Mitgliedsbeitrag" vorkämen, oder wenn nach SELECT nur das Feld KundenID steht. Weitere Beispiele findest du hier.
Gruß Buri
[ Nachricht wurde editiert von Buri am 19.08.2012 09:33:59 ]
|
Profil
Quote
Link |
hingiswiss
Aktiv  Dabei seit: 02.04.2005 Mitteilungen: 428
Aus:
 |     Beitrag No.2, vom Themenstarter, eingetragen 2012-08-19 16:27
|
Hallo Buri,
danke für die Antwort.
Soweit ich weiss, group by muss nicht immer mit einer Aggregationsfunktion in Beziehung gebracht werden. Also:
SELECT KundenID
FROM Kasseneinnahmen
GROUP BY KundenID;
dann gibt der Code alle distinkten Kunden ID aus:
KundenID
33
45
35
59
Bei dem Code im ersten Beitrag:
SELECT KundenID, Beschreibung
FROM Kasseneinnahmen
GROUP BY KundenID;
hätte ich eigentlich gedacht, dass alle distinkten Zeilen ausgegeben werden. Also, logisch müsste es ja so sein.
Jetzt stellt sich die Frage ob das DBMS-abhänging ist.
Schöne Grüße aus Rheinland,
Eure Ratna
|
Profil
Quote
Link |
matph
Senior  Dabei seit: 20.11.2006 Mitteilungen: 3813
Aus: A
 |     Beitrag No.3, eingetragen 2012-08-19 17:38
|
Hallo,
Nehmen wir an, wir haben eine Tabelle t1:
id kid besch
----------------------------------------------
1 3 This is sample data #1
2 5 This is sample data #2
3 7 This is sample data #3
4 5 This is sample data #4 | so lässt sich natürlich normalerweise mit:
select kid, besch from t1 | dies:
3 This is sample data #1
5 This is sample data #2
7 This is sample data #3
5 This is sample data #4 | mit:
select kid, besch from t1 group by kid | dies:
3 This is sample data #1
5 This is sample data #4
7 This is sample data #3 | bzw. mit:
select kid from t1 group by kid | dies:
abfragen
--
mfg
matph
----------------- Wir müssen wissen, wir werden wissen. Hilbert
Das Buch der Natur ist in der Sprache der Mathematik geschrieben. Galilei
[ Nachricht wurde editiert von matph am 19.08.2012 17:47:20 ]
|
Profil
Quote
Link |
hingiswiss
Aktiv  Dabei seit: 02.04.2005 Mitteilungen: 428
Aus:
 |     Beitrag No.4, vom Themenstarter, eingetragen 2012-08-19 18:34
|
Hallo mathph,
danke für deine Beispiele. Das Beispiel mit folgendem Code macht mich ein wenig stutzig:
SELECT kid, besch FROM t1 GROUP BY kid
3 This is sample data #1
5 This is sample data #4
7 This is sample data #3
Was ist mit dem Value "This is sample data #2" ?
Denn, "This is sample data #2" und "This is sample data #4" haben zwar beide den gleichen ID, aber sie sind nicht gleich. Oder anders gefragt, woher weiss ich ob SQL #4 oder #2 bei Ausführung dieses Codes ausgibt?
Schöne Grüße aus Rheinland,
Eure Ratna
|
Profil
Quote
Link |
matph
Senior  Dabei seit: 20.11.2006 Mitteilungen: 3813
Aus: A
 |     Beitrag No.5, eingetragen 2012-08-19 19:10
|
Hallo,
Solange in der Referenz deines Systems nichts spezifisch angegeben wird, weißt du es gar nicht, doch es handelt sich ohnehin hier um eine fälschliche Verwendung von GROUP BY siehe auch Beitrag No.1.
Richtig ginge es so:
SELECT DISTINCT kid, besch FROM t1 | was zu:
3 This is sample data #1
5 This is sample data #2
7 This is sample data #3
5 This is sample data #4 | führt, bzw:
SELECT DISTINCT kid FROM t1 | mit dem Resultat:
--
mfg
matph
----------------- Wir müssen wissen, wir werden wissen. Hilbert
Das Buch der Natur ist in der Sprache der Mathematik geschrieben. Galilei
|
Profil
Quote
Link |
viertel
Senior  Dabei seit: 04.03.2003 Mitteilungen: 21589
Aus: Hessen
 |     Beitrag No.6, eingetragen 2012-08-19 20:36
|
Hi hingiswiss
Deshalb wird ja auch nach einer Aggregatfunktion verlangt. Z.B. können Preise addiert oder das Maximum gesucht werden oder … oder.
Aber was würdest du denn bei deinem Beispiel überhaupt erwarten?
Ok, manche der KundenID's sind mehrfach, nach denen kann aggregiert werden. Aber die unterschiedlichen Beschreibungen (bei gleicher K-Id), was soll damit passieren? Rechnen kann man damit nix. Man könnte die alphabetisch erste Beschreibung anfordern, aber macht das Sinn?
Wie gesagtgefragt: was würdest du denn als Output bei der Abfrage im Themenstart erwarten?
Oder, ganz anders gefragt:
Was willst du überhaupt erreichen?
Gruß vom ¼
-----------------

|
Profil
Quote
Link |
hingiswiss
Aktiv  Dabei seit: 02.04.2005 Mitteilungen: 428
Aus:
 |     Beitrag No.7, vom Themenstarter, eingetragen 2012-08-20 20:32
|
vielen Dank zusammen.
Schöne Grüße aus Rheinland,
Eure Ratna
|
Profil
Quote
Link |
viertel
Senior  Dabei seit: 04.03.2003 Mitteilungen: 21589
Aus: Hessen
 |     Beitrag No.8, eingetragen 2012-08-20 21:26
|
Hä, was ist denn das für ein Abschluß?
Es kann dich ja niemand zwingen, deine Erkenntnisse hier kundzutun. Oder die gestellten Fragen zu beantworten.
Aber so einfach sang und klanglos die Tür zuknallen?
Keine feine Art
|
Profil
Quote
Link |
hingiswiss
Aktiv  Dabei seit: 02.04.2005 Mitteilungen: 428
Aus:
 |     Beitrag No.9, vom Themenstarter, eingetragen 2012-08-20 21:39
|
ach ja, ganz vergessen, sorry:
der grund war ganz einfach und schlicht, da ich die Mechanik verstehen wollte, wie Group By arbeitet. Bisher hab ich die Funktion Group By immer einfach so hingenommen, ohne groß darüber nachzudenken, was wie als erstes oder nächstes bei einer Group By anfrage ausgeführt wird.
Schöne Grüße aus Rheinland,
Eure Ratna
|
Profil
Quote
Link |
hingiswiss
Aktiv  Dabei seit: 02.04.2005 Mitteilungen: 428
Aus:
 |     Beitrag No.10, vom Themenstarter, eingetragen 2012-08-20 21:41
|
Meine Erkenntnis nach diesem Thread ist jedenfalls:
man kann zwar viel mit group by experimentieren, aber ohne Aggregatsfunktion ist group by EIGENTLICH nicht sehr geeignet, eine Anfrage zu erstellen.
Desweiteren bin ich immer noch der Meinung, dass bei:
...
...
group by A, B, C;
alle DISTINKTE Zeilen von A, B und C genommen werden.
|
Profil
Quote
Link |
viertel
Senior  Dabei seit: 04.03.2003 Mitteilungen: 21589
Aus: Hessen
 |     Beitrag No.11, eingetragen 2012-08-20 22:07
|
Davon will dich auch niemand abbringen
Aber wenn es dir nur um die unterschiedlichen Werte-Kombinationen der Felder A, B und C geht, dann kannst du das auch so abfragen:SQL SELECT DISTINCT A,B,C
FROM Tabelle |
Wenn du aber wissen willst, wie oft jede vorkommt, dann z.B. so:SQL SELECT A, B, C, SUM(1) AS Zaehler
FROM Tabelle
GROUP BY A, B, C |
|
Profil
Quote
Link |
hingiswiss
Aktiv  Dabei seit: 02.04.2005 Mitteilungen: 428
Aus:
 |     Beitrag No.12, vom Themenstarter, eingetragen 2012-08-20 22:39
|
so etwas geht nicht, oder?
SELECT A SUM(1) AS Zaehler
FROM Tabelle
GROUP BY A, B, C
|
Profil
Quote
Link |
viertel
Senior  Dabei seit: 04.03.2003 Mitteilungen: 21589
Aus: Hessen
 |     Beitrag No.13, eingetragen 2012-08-20 23:24
|
Abgesehen davon, daß zwischen A und SUM ein Komma fehlt?
Gegenfrage:
Was sollte denn (deiner Meinung nach) dabei herauskommen?
Anders gefragt: welchen Sinn hätte so eine Abfrage?
Klär mich an diesem Beispiel auf:Beispieltabelle A B C
-+-+-
X Y Y
X Z Y
P Q R |
Was soll die AbfrageSQL SELECT A, SUM(1) AS Zaehler
FROM Tabelle
GROUP BY A, B, C | liefern?
|
Profil
Quote
Link |
hingiswiss
Aktiv  Dabei seit: 02.04.2005 Mitteilungen: 428
Aus:
 |     Beitrag No.14, vom Themenstarter, eingetragen 2012-08-20 23:46
|
ich bin überfragt..
|
Profil
Quote
Link |
hingiswiss
Aktiv  Dabei seit: 02.04.2005 Mitteilungen: 428
Aus:
 |     Beitrag No.15, vom Themenstarter, eingetragen 2012-08-21 00:10
|
mhh.. von meiner logik her müsste es das hier rauskommen:
A Zähler
- ------
X weiss nicht, da nicht weiss was SUM(1) macht
X weiss nicht, da nicht weiss was SUM(1) macht
P weiss nicht, da nicht weiss was SUM(1) macht
Begründung:
GROUP BY A,B,C spezifiziert, dass alle 3 Zeilen ausgegeben werden, da alle 3 distink sind. Je Zeile ist quasi eine eigene "Gruppe".
Nun, dass bei der Projektion lediglich die Ausgabe der Spalte A erwünscht ist, beeinflusst die vorige group by-Ausgabe nicht.
Danke.
Schöne Grüße aus Rheinland,
Eure Ratna
|
Profil
Quote
Link |
viertel
Senior  Dabei seit: 04.03.2003 Mitteilungen: 21589
Aus: Hessen
 |     Beitrag No.16, eingetragen 2012-08-21 01:57
|
Ja, ist richtig.
Aber es bleibt die Frage nach dem Sinn einer solchen Query: nach mehreren Feldern gruppieren, aber nur eines davon für die Ausgabe selektieren.
SUM(1)
Die Tabelle hat eine vierte (Pseudo)Spalte, deren Wert immer 1 ist. Und nach dieser Spalte wird nicht gruppiert, sondern summiert. Dadurch werden die unterschiedlichen Zeilen (Gruppenrepräsentanten) gezählt.
Hast du denn kein DB-System zur Verfügung, um dir solche Fragen selbst zu beantworten, indem du einfach ausprobierst/experimentierst? Sowas kannst du auch mit einer Access-DB machen, dazu brauchst du kein ausgewachsenes DB2. Gut, alles geht damit auch nicht, aber bis du an diese Grenze stößt ist es sehr hilf- und lehrreich.
|
Profil
Quote
Link |
matph
Senior  Dabei seit: 20.11.2006 Mitteilungen: 3813
Aus: A
 |     Beitrag No.17, eingetragen 2012-08-21 02:05
|
Hallo,
Oder ohne jegliche Installation mittels SQLite
--
mfg
matph
----------------- Wir müssen wissen, wir werden wissen. Hilbert
Das Buch der Natur ist in der Sprache der Mathematik geschrieben. Galilei
|
Profil
Quote
Link |