SQL Statement mit SUM...

Seite 1 von 1 - Forum: Coding Stuff auf overclockers.at

URL: https://www.overclockers.at/coding-stuff/sql_statement_mit_sum_188827/page_1 - zur Vollversion wechseln!


semteX schrieb am 07.12.2007 um 16:45

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?


pong schrieb am 07.12.2007 um 16:50

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 schrieb am 07.12.2007 um 16:53

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 schrieb am 07.12.2007 um 16:59

geht das überhaupt mit sql was du da willst?


semteX schrieb am 07.12.2007 um 17:01

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 schrieb am 07.12.2007 um 17:04

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 schrieb am 07.12.2007 um 22:26

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 schrieb am 07.12.2007 um 23:16

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 schrieb am 07.12.2007 um 23:23

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 schrieb am 07.12.2007 um 23:55

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 schrieb am 08.12.2007 um 07:48

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


semteX schrieb am 11.12.2007 um 10:12

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 schrieb am 11.12.2007 um 12:19

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 schrieb am 13.12.2007 um 23:57

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 :)




overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2025