Ответ 1
Вы можете использовать оператор CASE
:
SELECT count(id),
SUM(hour) as totHour,
SUM(case when kind = 1 then 1 else 0 end) as countKindOne
У меня есть столбец "час" У меня есть столбец типа (он может быть 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 field b = field a
.. Я не могу ответить на этот вопрос...
Вы можете использовать оператор CASE
:
SELECT count(id),
SUM(hour) as totHour,
SUM(case when kind = 1 then 1 else 0 end) as countKindOne
вам нужно что-то вроде:
SELECT count(id), SUM(hour) as totHour, SUM(kind=1) as countKindOne;
Обратите внимание, что ваш второй пример был близок, но функция IF() всегда принимает три аргумента, поэтому это должно было быть COUNT(IF(kind=1,1,NULL))
. Я предпочитаю синтаксис SUM(), показанный выше, потому что он кратким.
Вы также можете использовать 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
Существует небольшая разница между основными ответами, а именно 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
SUM(case when kind = 1 then 1 else 0 end)
, 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
Из MYSQL я решил проблему следующим образом:
SUM(CASE WHEN used = 1 THEN 1 ELSE 0 END) as amount_one,
Надеюсь, это поможет: D
Стоит отметить, что вы можете опираться на ответ Гевина Тауэйса, используя несколько полей в запросе, например:
SUM(table.field = 1 AND table2.field = 2)
Вы также можете использовать этот синтаксис для COUNT
и я уверен, что другие функции также.