2016-09-11 5 views
4

Wie kann ich den maximalen Wert aus der folgenden Abfrage erhalten:SQL: Kombinieren Summe und max Aggregatfunktion

select sum(hours) from works_on group by pno; 
+------------+ 
| sum(hours) | 
+------------+ 
|  52.50 | 
|  50.00 | 
|  55.00 | 
|  25.00 | 
|  55.00 | 
+------------+ 

Was ich will, ist:

|  55.00 | 
|  55.00 | 

Vielen Dank im Voraus.

Antwort

3

Verwenden Sie Having Klausel und Sub-query. So etwas wie dieses

SELECT Sum(hours) 
FROM works_on 
GROUP BY pno 
HAVING Sum(hours) = (SELECT Sum(hours) h 
        FROM works_on 
        GROUP BY pno 
        ORDER BY h DESC 
        LIMIT 1) 

Aber es ist wirklich einfach in SQL SERVER wo wir TOP 1 with Ties haben, die die sub-query

0

oder einen anderen Ansatz vermeidet, dass nur die maximale Summe zurückgibt, (eine Zeile nur) ist

Select Max(sumHrs) 
From (Select sum(hours) sumHrs 
     From works_on 
     gtoup by pno) z 

Ich frage mich, was ist der Wert der Rückgabe mehrerer Zeilen aus einer Ergebnismenge, die bereits eine Aggregation ist, und nicht die Rohdatenzeilen. Wenn Ihre gewünschten Ergebnisse auch die pno Wert enthalten, dann würde ich verstehen (Sie möchten wissen, welche pno s haben die höchste Summe von Stunden), aber nur die maximale Summe der Stunden zu erhalten scheint nicht viel Wert zu haben. Oder haben Sie einen Teil des Problems einfach der Einfachheit überlassen?

+0

Dazu können wir 'Order By' mit' Limit' verwenden, um den Maximalwert zu erhalten. –

1

Wenn Sie nur den Maximalwert wollen, dann werden eine Reihe tun:

select sum(hours) 
from works_on 
group by pno 
order by sum(hours) desc 
limit 1; 

Ich bin nicht sicher, warum Sie zwei Reihen wollen würde, aber dann ist PRDP Antwort die richtige ist.