Как СУММИРОВАТЬ с условием при группировании

#mysql #sql #aggregate-functions

#mysql #sql #агрегатные функции

Вопрос:

У меня есть список строк, и я хотел бы суммировать количество строк при группировке (своего рода ПОДСЧЕТ), но только тогда, когда для каждой строки поле CustomField = 0.

Пример :

 title       customField
aaa         1
aaa         0
bbb         0
ccc         1
bbb         1
aaa         0
  

Итак, результат должен быть :

 aaa 2
bbb 1
ccc 0
  

Как я могу это сделать с MySQL?

Редактировать

На самом деле мой реальный запрос — это :

 SELECT forum_categories.title, COUNT(forum_topics.id) AS total_topics, COUNT(forum_messages.id) AS total_replies, MAX(forum_messages.date) AS last_message
FROM forum_categories
JOIN forum_topics ON forum_topics.category_id = forum_categories.id 
JOIN forum_messages ON forum_messages.topic_id = forum_topics.id
GROUP BY forum_categories.id ORDER BY forum_categories.date
  

И я должен считать COUNT(forum_messages.id) AS total_replies только тогда forum_messages.original=0 , вот почему я запрашиваю СУММУ 🙂

Ответ №1:

Просто отфильтруйте результирующий набор, чтобы исключить customField=1 , т.Е.

   SELECT title, COUNT(*) AS numTitle
    FROM yourtable
   WHERE customField = 0
GROUP BY title
ORDER BY numTitle DESC
  

Результат:

 aaa 2
bbb 1
  

Чтобы отобразить все заголовки, включая те, которые имеют значение 0: (также полезно, если требуются другие подсчеты)

   SELECT title
       , SUM(CASE WHEN customField=0 THEN 1 ELSE 0 END) AS numTitle
    FROM yourtable
GROUP BY title
ORDER BY numTitle DESC
  

Результат:

 aaa 2
bbb 1
ccc 0
  

Более компактный (но работает только в MYSQL):

   SELECT title
       , SUM(customField=0) AS numTitle
    FROM yourtable
GROUP BY title
ORDER BY numTitle DESC
  

Комментарии:

1. Не совсем уверен, что я следую тогда. Вы могли бы использовать CASE в SUM , так что, как SELECT title, SUM(CASE WHEN customField=0 THEN 1 ELSE 0 END) … ?

2. Да, кажется, работает! Спасибо @ypercube : с предложением в комментариях это тоже показывается 😉