"We are back" « oc.at

SQL Statement mit SUM...

semteX 07.12.2007 - 16:45 1335 13
Posts

semteX

begehrt die rostschaufel
Avatar
Registered: Oct 2002
Location: Pre
Posts: 14713
Wiedermal ne gschicht wo ich mir dachte "is ja eh ganz easy"... die aber dann irgendwie beim schreiben auf einmal gar nimmer so einfach ist... folgendes testsetup:

Code:
 Tabelle: test

|--- name ---|--- val ---|
  asdf             10
  ghij              7
  klmn            3

ich möcht jetzt, dass er mir

folgende ausgabe möchte ich jetzt:
asdf 10
ghij 7

und die beschränkung soll sein: wenn die summe der datensätze, die er atm selektiert hat, 17 übersteigt, soll er abbrechen...

würd also von der logik etwa so aussehen:
SELECT name, val FROM test WHERE sum(val) <= 17

nur, dass WHERE keine aggregation tolleriert...

wo hab ich nen knoten im hirn?
Bearbeitet von semteX am 07.12.2007, 16:47

pong

Addicted
Avatar
Registered: Oct 2001
Location: Wien (ned im Kra..
Posts: 414
select name, sum(val) as a from irgendwo where a <= 17 group by name ?

pong

ps: Wennst es in einem Programm verwendest, den Indicator nicht vergessen

semteX

begehrt die rostschaufel
Avatar
Registered: Oct 2002
Location: Pre
Posts: 14713
das geht leider ned weil das a wieder ne sum ist => aggregation.

das selbe ding mit having funktioniert aber auch nicht, weil er, bei group by name, immer nur "asdf 10", "ghij 7" ... als "summe" sieht..

Nico

former person of interest
Registered: Sep 2006
Location: -
Posts: 4082
geht das überhaupt mit sql was du da willst?

semteX

begehrt die rostschaufel
Avatar
Registered: Oct 2002
Location: Pre
Posts: 14713
ich hab vor 12 monaten so krassn ******* mit SQL statements gemacht... da kann i ma ned vorstellen, dass so was ned geht :D

i werd mal alle unterlagen vom letzten jahr zamsuchn ob ma da mal was in die richtung gmacht haben

Burschi1620

24/7 Santa Claus
Avatar
Registered: Apr 2004
Location: Drüber da Donau
Posts: 6792
Code:
mysql> select sum(Umsatz),Ort from testerone group by Ort
-> having sum(Umsatz)>=50000;
hab ich von hier gefunden:
http://www.infos24.de/mysqle/handbuch/3_mysql_count.htm

Gehts dann vielleicht so:
Code:
mysql> select sum(val),name from bla group by name
-> having sum(val)<=17;

kleinerChemiker

Here to stay
Avatar
Registered: Feb 2002
Location: Wien
Posts: 4303
du mußt erst aggregieren und kannst dann davon die summe berechnen.
aber so lange zu aggregieren bis die summe einen wert erreicht, geht mw nicht.

LoSerRaTiO

www.krenker.at
Avatar
Registered: Sep 2003
Location: krenker.at
Posts: 744
das geht mit einer standard-sql query nicht, da die aggregation ja zusätzlich auch noch von der order der query abhängig ist.
einfachste variante imho: Stored Procedure mit Cursor

(zumindest mal am MSSQL bzw MySQL 5...)

ein einbau in die anwendungslogik bringt dich aber vermutlich mal schneller zum ziel.

LoSerRaTiO

www.krenker.at
Avatar
Registered: Sep 2003
Location: krenker.at
Posts: 744
Zitat von Burschi1620
Gehts dann vielleicht so:
Code:
mysql> select sum(val),name from bla group by name
-> having sum(val)<=17;

also imho gibt dieses statement seine beispieltabelle 1:1 aus, höchstens er hat entweder gleiche namen, die zusammen über 17 ergeben oder vals über 17 --> die würden dann nicht ausgegeben werden.

semteX

begehrt die rostschaufel
Avatar
Registered: Oct 2002
Location: Pre
Posts: 14713
Zitat von Burschi1620
Code:
mysql> select sum(Umsatz),Ort from testerone group by Ort
-> having sum(Umsatz)>=50000;
hab ich von hier gefunden:
http://www.infos24.de/mysqle/handbuch/3_mysql_count.htm

Gehts dann vielleicht so:
Code:
mysql> select sum(val),name from bla group by name
-> having sum(val)<=17;
funktioniert hier leider nicht... durch das group by gruppiert er alle mit der selben bezeichnung zusammen (in dem fall bez und bildet hier die Summe. da ich aber immer andere bezeichnungen habe fährt das hier ins leere, die SUM würde sich immer nur auf eine einzelne zeile beziehen

i fürcht langsam auch, dass das mit purem SQL ned geht... naja hilft nix, wirds halt in die business logik ausgelagert...

danke an die helfer

edit: ja, klar, mit pl sql bzw stored procedures + cursor wärs machbar... nur da kann ich dann gleich in die business logik gehen, da bleibt die wartbarkeit eher erhalten..

Luzandro

Here to stay
Avatar
Registered: Mar 2006
Location: 2482
Posts: 708
Du könntest ein Subselect machen:
Code:
SELECT t1.name, t1.val
FROM test t1 
WHERE (SELECT sum(t2.val) FROM test t2 WHERE t2.name <= t1.name) <= 17

edit: oder das müsste auch aufs gleiche rauslaufen:
Code:
SELECT t1.name, t1.val
FROM test t1, test t2
WHERE t2.name <= t1.name GROUP BY t1.name, t1.val HAVING sum(t2.val) <= 17
Bearbeitet von Luzandro am 08.12.2007, 07:54

semteX

begehrt die rostschaufel
Avatar
Registered: Oct 2002
Location: Pre
Posts: 14713
die idee wär prinzipiell ned schlecht, wenn ich ned nach val sortieren würd....

ich habs jetzt in die business logik geschmissen, danke für euren Input!

Luzandro

Here to stay
Avatar
Registered: Mar 2006
Location: 2482
Posts: 708
Zitat von semteX
die idee wär prinzipiell ned schlecht, wenn ich ned nach val sortieren würd....
das ist ja grundsätzlich egal - du müsstest halt nur auch im WHERE-Statement die Reihenfolge berücksichtigen, also statt t2.name<=t1.name eben t2.val<=t1.val

semteX

begehrt die rostschaufel
Avatar
Registered: Oct 2002
Location: Pre
Posts: 14713
wenn mal zeit ist tret ich das auf die schnelle übern postgre admin... ich hab es zwar jetzt scho über die business logik gelöst, allerdings würd es mich interessiern ob das ergebniss gestimmt hätt :)
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz