2015-10-15 3 views
0

У меня есть SQL-запрос, где им с помощью SUM:Есть ли способ суммировать значения строки?

SELECT 
    SUM(CASE WHEN `ID_Event1` != 0 THEN 1 ELSE 0 END) AS count1, 
    SUM(CASE WHEN `ID_Event2` != 0 THEN 1 ELSE 0 END) AS count2, 
    SUM(CASE WHEN `ID_Event3` != 0 THEN 1 ELSE 0 END) AS count3, 
    SUM(CASE WHEN `ID_Event4` != 0 THEN 1 ELSE 0 END) AS count4, 
    SUM(CASE WHEN `ID_Event5` != 0 THEN 1 ELSE 0 END) AS count5 
FROM `ec_calendar` WHERE Year(`Day`)=2015 AND Month(`Day`)=6 

Результат является:

enter image description here

Но я хочу SUM эти colums. Ожидаемый результат: (3 + 4 + 3 + 3 + 4).

Есть ли решение?

+0

это SQL или MySQL? – Alex

ответ

3

Затем используйте +:

SELECT (SUM(CASE WHEN `ID_Event1` != 0 THEN 1 ELSE 0 END) + 
     SUM(CASE WHEN `ID_Event2` != 0 THEN 1 ELSE 0 END) + 
     SUM(CASE WHEN `ID_Event3` != 0 THEN 1 ELSE 0 END) + 
     SUM(CASE WHEN `ID_Event4` != 0 THEN 1 ELSE 0 END) + 
     SUM(CASE WHEN `ID_Event5` != 0 THEN 1 ELSE 0 END) 
     ) as cnt 
FROM `ec_calendar` 
WHERE day >= '2015-06-01' and day < '2015-07-01' 

Обратите внимание, что я изменил положение WHERE. Этот метод более эффективен, если у вас есть индекс на day.

MySQL обрабатывает булевы как целые числа, так что вы можете написать это как:

SELECT (SUM(ID_Event1 <> 0) + SUM(ID_Event2 <> 0) + 
     SUM(ID_Event3 <> 0) + SUM(ID_Event4 <> 0) + 
     SUM(ID_Event5 <> 0) 
     ) as cnt 
FROM `ec_calendar` 
WHERE day >= '2015-06-01' and day < '2015-07-01' 
+0

Отличное решение, большое спасибо :) – Bullman

+0

Еще один вопрос. Есть ли способ получить данные за целый год? Теперь, в моем приложении, я должен вызвать этот запрос 12 раз, для каждого месяца. Можно сделать один запрос, который возвращает что-то вроде этого: http://i.imgur.com/gHqTaT3.png – Bullman

+0

Просто измените предложение 'where' для« 2015-01-01 »и« 2015-12-31 » ». –

2

Вы можете просто добавить вычисленные столбцы.

SELECT 
SUM(CASE WHEN `ID_Event1` != 0 THEN 1 ELSE 0 END) AS count1, 
SUM(CASE WHEN `ID_Event2` != 0 THEN 1 ELSE 0 END) AS count2, 
SUM(CASE WHEN `ID_Event3` != 0 THEN 1 ELSE 0 END) AS count3, 
SUM(CASE WHEN `ID_Event4` != 0 THEN 1 ELSE 0 END) AS count4, 
SUM(CASE WHEN `ID_Event5` != 0 THEN 1 ELSE 0 END) AS count5, 
SUM(CASE WHEN `ID_Event1` != 0 THEN 1 ELSE 0 END)+ 
SUM(CASE WHEN `ID_Event2` != 0 THEN 1 ELSE 0 END)+ 
SUM(CASE WHEN `ID_Event3` != 0 THEN 1 ELSE 0 END)+ 
SUM(CASE WHEN `ID_Event4` != 0 THEN 1 ELSE 0 END)+ 
SUM(CASE WHEN `ID_Event5` != 0 THEN 1 ELSE 0 END) as total 
FROM `ec_calendar` WHERE Year(`Day`)=2015 AND Month(`Day`)=6 
Смежные вопросы