2017-12-01 4 views
8

Ich habe eine Tabelle:Ist es möglich, Group by, Having und Sum zu kombinieren?

------------------------ 
|id|p_id|desired|earned| 
------------------------ 
|1 | 1 | 5 | 7 | 
|2 | 1 | 15 | 0 | 
|3 | 1 | 10 | 0 | 
|4 | 2 | 2 | 3 | 
|5 | 2 | 2 | 3 | 
|6 | 2 | 2 | 3 | 
------------------------ 

ich einige Berechnungen vornehmen müssen, und versuchen Sie es nicht wirklich komplexe Anforderung in einem zu machen, sonst weiß ich, wie es mit den Zahlen der Anfragen zu berechnen. Ich brauche führte Tabelle wie folgt vor:

--------------------------------------------------------- 
|p_id|total_earned| AVG |  Count  | SUM | 
| |   | (desired)|(if earned != 0)|(desired)| 
--------------------------------------------------------- 
| 1 |  7  |  10 |  1  | 30 | 
| 2 |  9  |  2 |  3  | 6 | 
--------------------------------------------------------- 

ich bisher bauen:

SELECT p_id, SUM(earned), AVG(desired), Sum(desired) 
FROM table GROUP BY p_id 

Aber ich kann nicht herausfinden, wie die Anzahl der gruppierten Datensätze mit Bedingungen zu berechnen. Ich kann diese Nummer mit HAVING aber in getrennter Anfrage erhalten.

Ich bin fast sicher, welche SQL diese Macht haben sollte.

+0

ich Postgres, aber ich suche nach universelle Lösung. –

Antwort

12

Sie können CASE Ausdruck dafür verwenden.

die Sie interessieren,

SELECT p_id 
    ,SUM(earned) AS total_earned 
    ,AVG(desired) AS avg_desired 
    ,COUNT(CASE WHEN Earned!=0 THEN 1 END) AS earned_count 
    ,SUM(desired) AS sum_desired 
FROM table 
GROUP BY p_id; 
3

Sie haben Ihre Abfrage hinzufügen nur bedingte Aggregation mit Hilfe von case Ausdruck für verdiente Zählung

p_id total_earned desired COUNT SUM 
1  7    10  1  30 
2  9    2   3  6 
+0

Das ist nicht Standard SQL –

+0

Ungültige Syntax für Postgres (oder Standard-SQL). –

3

Eine kürzere Alternative

SELECT 
      p_id, 
      SUM(earned) [total_earned], 
      AVG(desired) [desired], 
      SUM(CASE WHEN earned <> 0 THEN 1 ELSE 0 END) [COUNT], 
      SUM(desired) [SUM] FROM <table> 
GROUP BY p_id 

Ergebnis fast fertig CASE ist

weil NULL s nicht gezählt werden.