Schrift
[thread]3313[/thread]

Sätze in GROUP BY: kann ich das rausbekommen?



<< |< 1 2 >| >> 13 Einträge, 2 Seiten
macMeck
 2003-08-21 13:41
#35771 #35771
User since
2003-08-04
162 Artikel
BenutzerIn
[default_avatar]
Hallo zusammen,

ich habe ne SQL Abfrage in MySQL die ich mit nem GROUP BY auf ein Feld zusammenfasse. Kann ich jetzt noch irgendwie rausbekommen, welche Sätze in dieser GROUP drin sind? Also irgendwie ein Array, das die ID der Sätze enthält oder sowas?

macMeck
It all works, as long as it's documented!
Robby
 2003-08-21 14:16
#35772 #35772
User since
2003-08-11
409 Artikel
BenutzerIn
[default_avatar]
sorry, ich weiß nicht ganz was Du meinst. Poste mal deinen select und sag mir mal was Du genau haben willst :)
Kaum macht man es richtig - schon funktioniert es!
macMeck
 2003-08-21 14:24
#35773 #35773
User since
2003-08-04
162 Artikel
BenutzerIn
[default_avatar]
Also machen wir mal ein Beispiel. Die Tabelle sieht so aus:
ID USER BETRAG
1 1 5,20
2 2 6,10
3 2 5,90
4 1 3,15

Jetzt will ich ne Abfrage machen und dabei die User zusammenfassen, die Beträge addieren und trotzdem herausbekommen, welche Sätze ich da drin habe. Geht das in einer Abfrage?
[sql]SELECT ID, USER, SUM(BETRAG) AS BETRAG FROM TABELLE GROUP BY USER;[/sql]
Jetzt bekomme ich in der ID immer nur den ersten Satz des Users. Ich will aber irgendwie in nem Array alle Sätze. Also für die erste Gruppe (die als ein "Satz" ausgelesen wird) die IDs 1 und 4 und für die zweite Gruppe die IDs 2 und 3.
Klar geworden, was ich meine?

macMeck
It all works, as long as it's documented!
Relais
 2003-08-21 14:44
#35774 #35774
User since
2003-08-06
2244 Artikel
ModeratorIn
[Homepage] [default_avatar]
Du willst nur eine Zeile - GROUP BY
und kaum hast Du das Ergebnis willst Du plötzlich doch wieder alle Zeilen - ORDER BY

Du mußt Dich entscheiden ;)
Erst denken, dann posten --
26. Deutscher Perl- u. Raku -Workshop 15. bis 17.04.2024 in Frankfurt/M.

Winter is Coming
Robby
 2003-08-21 14:47
#35775 #35775
User since
2003-08-11
409 Artikel
BenutzerIn
[default_avatar]
bei einem group by über die User kannste die id vergessen. Und bei einem group by über die user und id bekommste wieder 4 einzelne Sätze :D
Kaum macht man es richtig - schon funktioniert es!
Crian
 2003-08-21 15:41
#35776 #35776
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Vielleicht hilft Dir ein Subselect im group by user?

Edit: Nein, ein Order by, siehe weiter unten...\n\n

<!--EDIT|Crian|1061538277-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
macMeck
 2003-08-21 20:04
#35777 #35777
User since
2003-08-04
162 Artikel
BenutzerIn
[default_avatar]
Sowas habe ich mir fast gedacht. Ich glaube die Sache mit dem GROUP BY macht die Sache nur unnötig kompliziert...

macMeck
It all works, as long as it's documented!
Crian
 2003-08-22 11:38
#35778 #35778
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
[quote=macMeck,21.08.2003, 12:24]Also machen wir mal ein Beispiel. Die Tabelle sieht so aus:
ID     USER     BETRAG
1      1        5,20
2      2        6,10
3      2        5,90
4      1        3,15

Jetzt will ich ne Abfrage machen und dabei die User zusammenfassen, die Beträge addieren und trotzdem herausbekommen, welche Sätze ich da drin habe. Geht das in einer Abfrage?
[sql]SELECT ID, USER, SUM(BETRAG) AS BETRAG FROM TABELLE GROUP BY USER;[/sql]
Jetzt bekomme ich in der ID immer nur den ersten Satz des Users. Ich will aber irgendwie in nem Array alle Sätze. Also für die erste Gruppe (die als ein "Satz" ausgelesen wird) die IDs 1 und 4 und für die zweite Gruppe die IDs 2 und 3.
Klar geworden, was ich meine?

macMeck[/quote]

[quote=macMeck,21.08.2003, 18<!--emo&:0]Sowas habe ich mir fast gedacht. Ich glaube die Sache mit dem GROUP BY macht die Sache nur unnötig kompliziert...

macMeck[/quote]

Ich glaube, das Group By brauchst Du schon... aber Du brauchst auch noch ein ORDER BY USER. Mal sehen, ich kann es hier leider nicht testen, aber vielleicht hilft Dir dies weiter:

Code: (dl )
1
2
3
4
SELECT ID, USER, SUM(BETRAG) AS BETRAG
   FROM TABELLE
   GROUP BY USER
   ORDER BY USER;


Edit SQL->CODE, SQL ist mir zu eigenwillig, das zerstört meine Einrückungen...\n\n

<!--EDIT|Crian|1061538212-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Shagreen
 2003-08-22 12:09
#35779 #35779
User since
2003-08-14
88 Artikel
BenutzerIn
[Homepage] [default_avatar]
Wenn Du MySQL 4.0.0 hast, kannst Du die UNION-Syntax ausprobieren:
[sql]SELECT USER, 0 AS ID, SUM(BETRAG) AS BETRAG
FROM TABELLE GROUP BY USER
UNION ALL
SELECT USER, ID, 0 AS BETRAG
FROM TABELLE
ORDER BY USER, BETRAG, ID;

sollte folgendes ergeben (nicht getestet):

USER ID BETRAG
1 1 0
1 4 0
1 0 8,35
2 2 0
2 3 0
2 0 12,00
[/sql]
Ansonsten mußt Du zwei einzelne SQL-Selects absetzen.

Edit: 0 AS ID statt ID ist besser und zeigt, die 0-Felder sind nur Lückenfüller\n\n

<!--EDIT|Shagreen|1061541524-->
Crian
 2003-08-22 12:17
#35780 #35780
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Aber wozu? Group By Order By macht exakt das, was er oben beschrieben hat.

Ein Beispiel aus meinem SQL-Buch:

"Der Chef will wissen, wieviel Stunden anrechenbarer Tätigkeiten im Februar für die einzelnen Aufträge geleistet worden sind. Folgende Liste wird gewünscht:

AUFNR | SUMME_DER_STUNDEN
------+--------------------
1111  | 512.00
2222  | 218.00
3333  | 231.00


In dieser Aufgabe stellt der einzelne Auftrag eine Gruppe dar. Die Auftragsnummer dient als Gruppenschlüssel. Pro Auftragsnummer ist die Summe der Stunden zu ermitteln.

Code: (dl )
1
2
3
4
5
SELECT aufnr, sum(tstd)
   FROM tposten
   WHERE tbnr BETWEEN 940201 AND 940228
   GROUP BY aufnr
   ORDER BY aufnr;

"\n\n

<!--EDIT|Crian|1061540638-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
<< |< 1 2 >| >> 13 Einträge, 2 Seiten



View all threads created 2003-08-21 13:41.