MySql: чи можна "ПІДВИЩИТИ ЯКЩО" або "ПІДЧИТАТИ ЯКЩО"?


83

У мене є стовпець "година" У мене є стовпець "вид" (це може бути 1,2 або 3)

Я хотів би зробити щось на зразок:

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

або

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

Але mysql скажи мені, що у мене помилка ... в чому помилка !?

Будь ласка, дивіться цю тему stackoverflow: MySQL SUM IF поле b = поле a

.. Я не можу відповісти на це ...

Відповіді:


157

Ви можете використовувати CASEтвердження:

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

4
Використовуйте свою логіку з IfSUM(IF(o.id < 500000, 1, 0)) AS imported
Zohaib

@Zohaib Мені подобається твій підхід більше - він коротший і зрозуміліший. Ще +1 за вирішення проблеми.
Ніно Шкопак

84

ви хочете щось на зразок:

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

Зверніть увагу, що ваш другий приклад був близьким, але функція IF () завжди приймає три аргументи, тому вона мала б бути COUNT(IF(kind=1,1,NULL)). Я віддаю перевагу синтаксису SUM (), показаному вище, оскільки він стислий.


28

Ви також можете використовувати SUM + IFкоротше, ніж 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

5

Існує невелика різниця між основними відповідями, а саме SUM(case when kind = 1 then 1 else 0 end)таSUM(kind=1) .

Коли всі значення в стовпці kindмають місце NULL, результат SUM(case when kind = 1 then 1 else 0 end)є 0, тоді як результат SUM(kind=1)є NULL.

Приклад ( http://sqlfiddle.com/#!9/b23807/2 ):

Схема:

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

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

Результати запиту:

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


1

Варто зазначити, що ви можете спиратися на відповідь Гевіна Тоуїса, використовуючи безліч полів у вашому запиті, наприклад

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

Ви також можете використовувати цей синтаксис для, COUNTі я впевнений, що для інших функцій.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.