113 votes

MySql : est-il possible de faire un 'SUM IF' ou un 'COUNT IF' ?

J'ai une colonne 'hour' (heure) J'ai une colonne "genre" (qui peut être 1, 2 ou 3).

J'aimerais faire quelque chose comme :

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

o

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

Mais mysql me dit que j'ai une erreur... quelle est l'erreur ?

Veuillez consulter ce sujet sur stackoverflow : MySQL SUM IF champ b = champ a

.. Je ne suis pas en mesure de répondre à cette question...

200voto

bluefeet Points 105508

Vous pouvez utiliser un CASE déclaration :

SELECT count(id), 
    SUM(hour) as totHour, 
    SUM(case when kind = 1 then 1 else 0 end) as countKindOne

90voto

Gavin Towey Points 2932

Vous voulez quelque chose comme :

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

Notez que votre deuxième exemple était proche, mais la fonction IF() toujours prend trois arguments, donc il aurait dû être COUNT(IF(kind=1,1,NULL)) . Je préfère la syntaxe SUM() présentée ci-dessus car elle est concise.

37voto

Onur Yıldırım Points 5566

Vous pouvez également utiliser SUM + IF qui est plus court que 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

11voto

eci Points 111

Il y a une légère différence entre les premières réponses, à savoir SUM(case when kind = 1 then 1 else 0 end) y SUM(kind=1) .

Lorsque toutes les valeurs de la colonne kind être NULL le résultat de SUM(case when kind = 1 then 1 else 0 end) es 0 alors que le résultat de SUM(kind=1) es NULL .

Un exemple ( http://sqlfiddle.com/#!9/b23807/2 ) :

Schéma :

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

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

Résultats de la recherche :

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

3voto

Fernando Souza Points 41

À partir de MYSQL, j'ai résolu le problème de la manière suivante :

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

J'espère que cela vous aidera :D

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X