MySql: Ist es möglich, 'SUM IF' oder 'COUNT IF' zu verwenden?

76

Ich habe eine Spalte 'Stunde' Ich habe eine Spalte 'Art' (es kann 1,2 oder 3 sein)

Ich möchte etwas tun wie:

SELECT count(id), SUM(hour) as totHour, SUM( IF ( kind = 1, 1, 0 ) ) as countKindOne

oder

SELECT count(id), SUM(hour) as totHour, COUNT( IF ( kind = 1 ) ) as countKindOne

Aber MySQL sagt mir, ich habe einen Fehler ... was ist der Fehler!?

Weitere Informationen finden Sie in diesem Thema zum Stapelüberlauf: MySQL SUM IF Feld b = Feld a

.. Ich kann das nicht beantworten ...

Realtebo
quelle

Antworten:

149

Sie können eine CASEAnweisung verwenden:

SELECT count(id), 
    SUM(hour) as totHour, 
    SUM(case when kind = 1 then 1 else 0 end) as countKindOne
Taryn
quelle
2
Verwenden Sie Ihre Logik mit IfSUM(IF(o.id < 500000, 1, 0)) AS imported
Zohaib
81

du willst so etwas wie:

SELECT count(id), SUM(hour) as totHour, SUM(kind=1) as countKindOne;

Beachten Sie, dass Ihr zweites Beispiel nahe war, aber die IF () - Funktion immer drei Argumente akzeptiert, also hätte es sein müssen COUNT(IF(kind=1,1,NULL)). Ich bevorzuge die oben gezeigte SUM () -Syntax, weil sie kurz ist.

Gavin Towey
quelle
26

Sie können auch verwenden, SUM + IFwas kürzer ist als SUM + CASE:

SELECT
    count(id)
    , SUM(IF(kind=1, 1, 0)) AS countKindOne
    , SUM(CASE WHEN kind=2 THEN 1 ELSE 0 END) AS countKindTwo
Onur Yıldırım
quelle
5

Es gibt einen kleinen Unterschied zwischen den Top-Antworten, nämlich SUM(case when kind = 1 then 1 else 0 end)und SUM(kind=1).

Wenn alle Werte in Spalte kindgeschehen zu sein NULL, der das Ergebnis SUM(case when kind = 1 then 1 else 0 end)ist 0, während das Ergebnis SUM(kind=1)ist NULL.

Ein Beispiel ( http://sqlfiddle.com/#!9/b23807/2 ):

Schema:

CREATE TABLE Table1
(`first_col` int, `second_col` int)
;

INSERT INTO Table1
    (`first_col`, `second_col`)
VALUES
       (1, NULL),
       (1, NULL),
       (NULL, NULL)
;

Abfrageergebnisse:

SELECT SUM(first_col=1) FROM Table1;
-- Result: 2
SELECT SUM(first_col=2) FROM Table1;
-- Result: 0
SELECT SUM(second_col=1) FROM Table1;
-- Result: NULL
SELECT SUM(CASE WHEN second_col=1 THEN 1 ELSE 0 END) FROM Table1;
-- Result: 0
eci
quelle
3

Mit MYSQL habe ich das Problem folgendermaßen gelöst:

SUM(CASE WHEN used = 1 THEN 1 ELSE 0 END) as amount_one,

Hoffe das hilft: D.

Fernando Souza
quelle
1

Es ist erwähnenswert, dass Sie auf der Antwort von Gavin Toweys aufbauen können, indem Sie mehrere Felder in Ihrer Anfrage verwenden, z

SUM(table.field = 1 AND table2.field = 2)

Sie können diese Syntax auch für verwenden, COUNTund ich bin sicher, dass auch andere Funktionen verwendet werden.

Antonius
quelle