Alt 09.11.2011, 17:07:21   #1 (permalink)
Multitalent
Benutzerbild von joschilein

ID: 9301
Lose-Remote

joschilein eine Nachricht über ICQ schicken
Reg: 05.05.2006
Beiträge: 1.414
joschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehen
Standard Grouping-Problem (erledigt)

Ich habe eine Tabelle die ungefähr so aussieht
idsubidname1name2val
11aa11
12aa20,9
13bb10,8
21ff11
31bNULL1
32aa30,5
4........
..........

Nun möchte ich eine Abfrage machen, die pro name1 eine Summe errechnet, wobei aber jeweils nur der größte Wert pro id berücksichtigt werden soll. Der Ausschnitt aus obigem Beispiel soll also liefern:
name1summe
b1,8
a1,5
f1

Die bisherige Abfrage macht das natürlich nicht richtig.
Code:
1:
2:
3:
4:
5:
SELECT name1 ,ROUND(SUM(val),2) as summe FROM table GROUP BY name1 ORDER BY summe DESC, name ASC
name1summe
a2,4
b1,8
f1

Wie bekomme ich das also geschickt hin? Ich habe schon verschiedene Kombinationen mit WHERE und MAX versucht, aber das wird irgendwie nichts. Das muss doch aber irgendwie gehen ?!

Einzige Alternative die ich sehe wäre eine Aufspaltung auf zwei Tabellen, einmal mit name1 (ohne Doppel) und einmal mit name2, aber das gefällt mir irgendwie gar nicht.


Heute schon gepixelt

Geändert von joschilein (10.11.2011 um 15:40:39 Uhr)
joschilein ist offline   Mit Zitat antworten
Gesponsorte Links
Alt 09.11.2011, 17:24:27   #2 (permalink)
Multitalent
Benutzerbild von joschilein

ID: 9301
Lose-Remote

joschilein eine Nachricht über ICQ schicken
Reg: 05.05.2006
Beiträge: 1.414
joschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehen
Standard

Jetzt ist mir doch noch eine Variante eingefallen:
Code:
1:
2:
3:
4:
5:
6:
SELECT name1 ,ROUND(SUM(val),2) as summe FROM table AS A WHERE A.val = (SELECT max(B.val) FROM table AS B WHERE A.id = B.id AND A.name1 = B.name1) GROUP BY name1 ORDER BY summe DESC, name ASC
Aber das geht doch bestimmt noch besser, oder?

Dann mache ich daraus noch die Erweiterung, in der nur die Zeilen mit subid=1 berücksichtigt werden:
Code:
1:
2:
3:
4:
5:
6:
7:
SELECT name1 ,ROUND(SUM(val),2) as summe2 FROM table AS A WHERE A.val = (SELECT max(B.val) FROM table AS B WHERE A.id = B.id AND A.name1 = B.name1) AND subid = 1 GROUP BY name1 ORDER BY summe2 DESC, name ASC
Gibt es jetzt noch eine Möglichkeit summe und summe2 gleichzeitig in ein Abfrageergebnis zu packen? Vermutlich nicht. Ist dann eh nur noch ein Schönheitsproblem.


Heute schon gepixelt
joschilein ist offline Threadstarter   Mit Zitat antworten
Alt 09.11.2011, 18:40:17   #3 (permalink)
be forever curious
Benutzerbild von tleilax

ID: 27936
Lose-Remote

Reg: 20.04.2006
Beiträge: 2.259
tleilax genießt hohes Ansehentleilax genießt hohes Ansehentleilax genießt hohes Ansehentleilax genießt hohes Ansehentleilax genießt hohes Ansehentleilax genießt hohes Ansehentleilax genießt hohes Ansehentleilax genießt hohes Ansehentleilax genießt hohes Ansehentleilax genießt hohes Ansehentleilax genießt hohes Ansehen
Standard

Ich habe selbst noch nie wirklich damit gearbeitet, aber MySQL hat die GROUP BY-Option WITH ROLLUP.

Da sich die beiden Queries ja nur um die Einschränkung auf subid=1 unterscheiden, würde es sich ja fast anbieten, einfach nach allen subid zu gruppieren und mittels WITH ROLLUP auch die Gesamtsumme direkt mit zu ermitteln. Kannst dann ja in der Logik entscheiden, was Du brauchst und was verworfen wird.

Würde das Ergebnis nicht in Spalten sondern in Zeilen liefern, aber das ist ja letztendlich auch nicht wirklich schlimm.

Wie's mit der Performance vom Ganzen aussieht, wird Dir und mir bestimmt jemand anderes beantworten können.
.lange tage und angenehme nächte, tlx
:.whatthemovie.com (Screenshots raten) | PHP ExportForce-Klasse
tleilax ist offline   Mit Zitat antworten
Alt 09.11.2011, 21:03:00   #4 (permalink)
Multitalent
Benutzerbild von joschilein

ID: 9301
Lose-Remote

joschilein eine Nachricht über ICQ schicken
Reg: 05.05.2006
Beiträge: 1.414
joschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehen
Standard

Über das Rollup bin ich auch schon gestolpert, habe aber bisher nicht einordnen können, ob oder wie das helfen könnte. Klingt aber plausibel, werde ich ausprobieren.

Performance ist in dem Fall sekundär, da es nur um eine selten benutzte Stelle für ausgewählte Benutzer geht bei der man für notfalls auch ein paar Sekunden warten mehrere Minuten Denkerei sparen kann.


Heute schon gepixelt
joschilein ist offline Threadstarter   Mit Zitat antworten
Alt 09.11.2011, 21:49:16   #5 (permalink)
alias Echnaton
Benutzerbild von transversalis

ID: 309239
Lose-Remote

Reg: 18.01.2008
Beiträge: 2.399
transversalis genießt hohes Ansehentransversalis genießt hohes Ansehentransversalis genießt hohes Ansehentransversalis genießt hohes Ansehentransversalis genießt hohes Ansehentransversalis genießt hohes Ansehentransversalis genießt hohes Ansehentransversalis genießt hohes Ansehentransversalis genießt hohes Ansehentransversalis genießt hohes Ansehentransversalis genießt hohes Ansehen
Standard

unter DB2 for z/OS würde das hier funktionieren:
Code:
1:
2:
3:
4:
5:
6:
7:
SELECT name1, SUM ( max_val ) as sum_max_val FROM ( SELECT id , name1 , max(val) as max_val FROM table GROUP BY id, name1 ) x GROUP BY name1 ORDER BY sum_max_val DESC
ich weiss allerdings nicht, ob MySQL schon nested tables beherrscht
"transversalis teleport" sprach der Magier und war fort
transversalis ist offline   Mit Zitat antworten
Alt 10.11.2011, 15:40:23   #6 (permalink)
Multitalent
Benutzerbild von joschilein

ID: 9301
Lose-Remote

joschilein eine Nachricht über ICQ schicken
Reg: 05.05.2006
Beiträge: 1.414
joschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehen
Standard

Da meine realen Datensätze etwas umfangreicher sind, als im vereinfachten Beispiel ganz oben, habe ich heute erstmal geprüft, was ich eigentlich als Ergebnis erwarten würde. Bisher hat nichts wirklich gepasst, auch das Rollup hat nicht so richtig weiter geholfen.

Ich habe nun zwei Varianten gefunden, die ich einfach als zwei Abfragen laufen lasse und das nicht noch krampfhaft in eine Abfrage quetsche.

Für den größten Wert pro id und name
Code:
1:
2:
3:
4:
5:
6:
7:
SELECT name1 ,ROUND(SUM(val),2) AS sum ,COUNT(*) AS count FROM table AS A WHERE subid = (SELECT subid FROM table AS B WHERE A.id = B.id AND A.name1 = B.name1 ORDER BY val DESC LIMIT 1) GROUP BY name1 ORDER BY sum DESC, name1 ASC
Für den größten Wert pro id (mit WHERE subid = 1 wäre es nur der erste, aber nicht zwangsweise der größte)
Code:
1:
2:
3:
4:
5:
6:
7:
SELECT name1 ,ROUND(SUM(val),2) AS sum ,COUNT(*) AS count FROM table WHERE subid = (SELECT subid FROM table AS B WHERE A.id = B.id ORDER BY val DESC, id ASC LIMIT 1) GROUP BY name1 ORDER BY sum DESC, name1 ASC


Heute schon gepixelt
joschilein ist offline Threadstarter   Mit Zitat antworten
Antwort

Gesponsorte Links

Anzeige


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[JS] Problem MaxFleit Programmierung 8 26.12.2008 10:47:24
USB Problem surge Sonstiges 8 29.05.2007 22:33:01
Problem gelöst :) kleenes mysql problem (auslesen) Rene Programmierung 0 17.09.2006 14:35:39
Win xp Problem blu21 Software/Windows 7 01.08.2006 11:17:35


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:35:50 Uhr.