# kleine SQL-Hilfe benötigt: not a single-group group function



## Dr. Dangerous (23. Dez 2007)

Hallo Community!

Wie muss die SQL-Syntax lauten, damit die Abfrage unten funktioniert?
Oder auch anders gefragt...wie kann ich die Aggregatfunktionen von SQL richtig verschachteln?

Vielen Dank im voraus.


Ich will von der Datenbank wissen, welches Produkt die größte Abweichung vom Minimalpreis hat.

```
SELECT descrip,MAX(AVG(STDPRICE) - AVG(MINPRICE) ) FROM product,price WHERE product.prodid=price.prodid GROUP BY descrip ORDER BY 2 DESC
```

Ich bekomme folgende Fehlermeldung:


> SELECT *d*escrip,MAX( AVG(STDPRICE) - AVG(MINPRICE) ) FROM product,price WHERE product.prodid=price.prodid GROUP BY descrip ORDER BY 1 DESC
> 
> ERROR at line 1:
> ORA-00937: not a single-group group function



Bye bye


----------



## SlaterB (23. Dez 2007)

fange einfach an, erst

SELECT descrip FROM product GROUP BY descrip

dann join, dann avg usw.


----------



## Guest (23. Dez 2007)

Siehe: http://ora-00937.ora-code.com/

Es stört sich an der Subtraktion. 

Lösung: Zwei Abfragen. Durchschnitt ermitteln und dann die maximale Abweichung.
Kostet paar Millisekunden mehr, hält dich aber nicht auf.

Die Logik der Abfrage kann ich aber nicht ganz nachvollziehen. Gibt es pro Produkt mehrere
Preise (mehrfach MIN und STD)? Warum Durchschnitt und nicht einfach Differenz?
	
	
	
	





```
SELECT descrip, MAX(STDPRICE - MINPRICE)
```


----------



## SlaterB (25. Dez 2007)

ist doch GROUP BY descrip


----------



## FenchelT (27. Dez 2007)

Dr. Dangerous hat gesagt.:
			
		

> Ich bekomme folgende Fehlermeldung:
> 
> 
> > SELECT *d*escrip,MAX( AVG(STDPRICE) - AVG(MINPRICE) ) FROM product,price WHERE product.prodid=price.prodid GROUP BY descrip ORDER BY 1 DESC
> ...





Was moechtest Du denn ueberhaupt erreichen?

Die avg() Funktion liefert die den Durchschnittswert aller Eintraege einer Spalte. Es kann nur einen Durchschnittswert geben, genauso wie es nur einen min und einen max-Wert geben kann.

Nun ziehst Du den Durchschnittswert der einen Spalte vom Durchschittswert der anderen Spalte ab und erhaeltst wieder einen Wert. Dazu brauchst Du also die Max() Funktion nicht.


----------

