2017-11-15 2 views
0

Ich versuche, eine Gesamtsumme aller Spalten zu erhalten, die eine Bedingung erfüllen. Hier ist meine aktuelle Setupmysql SUM-Spalte auf WHERE-Bedingung

SELECT 
         COUNT(order_type = 'BUY') AS buy_fill, 
         COUNT(order_type = 'SELL') AS sell_fill, 
         SUM(btc_total) AS fill_sum 
         FROM fill_orders 
         WHERE coin_id = '$coin' 
         AND time_stamp >= DATE_SUB(NOW(), INTERVAL 55 SECOND) 

Das ist, was ich habe jetzt und seine Zählung, wie viele Arten von Kauf- und Verkaufsaufträge ich habe und auch gibt mir Summe aller Aufträge, aber ich muss die Pause, um die Summe der Bestellungen in Kaufaufträge und VERKAUFEN Bestellungen.

Heres der Code, den ich versuche, Arbeit zu machen. Ich habe hinzugefügt (btc_total WHERE order_type = 'KAUFEN') und SUM (btc_total WHERE order_type = 'verkaufen')

 SELECT 
          COUNT(order_type = 'BUY') AS buy_fill, 
          COUNT(order_type = 'SELL') AS sell_fill, 
          SUM(btc_total) AS fill_sum, 

          SUM(btc_total WHERE order_type = 'BUY') AS buy_total 
          SUM(btc_total WHERE order_type = 'SELL') AS sell_total 
         FROM fill_orders 
         WHERE coin_id = '$coin' 
         AND time_stamp >= DATE_SUB(NOW(), INTERVAL 55 SECOND) 
+0

'GROUP BY order_type'? Fügen Sie das zu Ihrer ursprünglichen Aussage hinzu, nicht Ihre neue – Mako212

+0

Dabei würden Sie auch die zwei 'COUNT' Reihen in die einzelne Linie' COUNT (order_type) als Füllung' reduzieren wollen. – Mako212

+0

Nun, ich brauche immer noch die COUNT als Im verwenden diese Daten. Ich muss nur meine Abfrage erweitern und die fill_sum in BUY und SELL-Summen brechen, da die fill_sum eine Kombination aus beidem ist. – user3369825

Antwort

1

„bedingte Aggregate“ enthalten üblicherweise ein case expression

SELECT 
     COUNT(CASE WHEN order_type = 'BUY' THEN order_type END)  AS buy_fill 
    , COUNT(CASE WHEN order_type = 'SELL' THEN order_type END)  AS sell_fill 
    , SUM(btc_total)            AS fill_sum 
    , SUM(CASE WHEN order_type = 'BUY' THEN btc_total ELSE 0 END) AS buy_total 
    , SUM(CASE WHEN order_type = 'SELL' THEN btc_total ELSE 0 END) AS sell_total 
FROM fill_orders 
WHERE coin_id = '$coin' 
AND time_stamp >= DATE_SUB(NOW(), INTERVAL 55 SECOND) 
+0

Das hat perfekt funktioniert! Vielen Dank! – user3369825

1

ändern diese:

SUM(btc_total WHERE order_type = 'BUY') AS buy_total 

dazu:

SUM(IF(order_type='BUY',btc_total,NULL)) AS buy_total 

Die Funktion MySQL IF() wertet das erste Argument als boolesche Variable aus, wenn das der Wert TRUE ist, gibt es das zweite Argument zurück, andernfalls gibt es das dritte Argument zurück.

Die IF() wird für jede Zeile ausgewertet, und die Rückgabe von diesem Ausdruck wird durch das Aggregat SUM() aufsummiert.

oder mehr verwenden, um das ANSI-Standard-äquivalent um das gleiche Ergebnis zu erzielen:

SUM(CASE WHEN order_type = 'BUY' THEN btc_total END) AS buy_total 

Dieses Muster wird im Allgemeinen als "conditional Aggregation".

Für die „zählt“ können wir COUNT mit SUM, wie diese ersetzen:

SUM(order_type = 'BUY') AS buy_fill 

MySQL wertet den Gleichheitsvergleich als boolean, die 1, 0 oder NULL zurückgibt, die dann durch die aufsummiert SUM-Aggregat (. A COUNT davon wäre Nullen und Einsen umfassen, nicht nur diejenigen)

Die oben entspricht

SUM(CASE 
    WHEN order_type = 'BUY' THEN 1 
    WHEN order_type <> 'BUY' THEN 0 
    ELSE NULL 
    END 
    ) AS buy_fill 

Wenn wir ein COUNT Aggregat verwenden möchten, könnten wir es so machen:

COUNT(IF(order_type = 'Buy',1,NULL)) AS buy_fill 

(Wir alle nicht-null-Wert anstelle von 1 verwenden könnte, und ein äquivalentes Ergebnis erhalten.)

+0

Das war auch die richtige Antwort, danke! – user3369825