подсчитывать строки, которые выполняют условие

#mysql #view

#mysql — сервер #Вид #mysql

Вопрос:

Я действительно думаю, что вопрос, который у меня есть, не слишком конкретен, я просто не знаю, как это объяснить.

Допустим, у меня есть таблица со следующими столбцами

team | gameType | date | outcome

Я хотел бы создать представление, в котором перечислены некоторые статистические данные о командах

SELECT team, count(*) as FROM matches GROUP BY team ORDER BY total DESC

Теперь я хочу добавить столбцы, подсчитывающие общее количество

  • какие были игры лиги
  • которые были в прошлом месяце
  • Победы
  • потери
  • связи

Цель состоит в том, чтобы создать представление в базе данных, а не какие-либо новые таблицы или столбцы.

Ответ №1:

Вы можете использовать операторы case в своих функциях агрегирования для агрегирования только для определенных событий.

 SELECT 
    team, 
    count(*) total_matches,
    count(case when gameType = 'league' then 1 end) league_matches,
    count(case then date > now() - INTERVAL 30 DAY then 1 end) recent_matches,
    ...
FROM matches 
GROUP BY team
  

Ответ №2:

Общая идея состоит в том, чтобы использовать выражение CASE внутри агрегата

 SELECT
    team,
    count(*) as total,
    count(CASE WHEN outcome = 'WIN' THEN 1 END) as wins,
    count(CASE WHEN outcome = 'DRAW' THEN 1 END) as draw,
    count(CASE WHEN outcome = 'LOSE' THEN 1 END) as losses,
    count(CASE WHEN gametype = 'League' THEN 1 END) as leaguegames,
    count(CASE WHEN DATE_SUB(CURDATE(), INTERVAL 1 MONTH) < dateTHEN 1 END) as lastmonth
FROM matches
GROUP BY team 
ORDER BY total DESC
  

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

1. @Konerak: нет. COUNT(NULL) игнорируется из-за отсутствия условия «ELSE»

Ответ №3:

Несколько проще и читабельнее (по крайней мере, для меня), чем использование CASE, использует ИЛИ:

 SELECT
   team,
   count(*) as total,
   count(outcome = 'WIN'  OR NULL) as wins,
   count(outcome = 'DRAW' OR NULL) as draw,
   ...
FROM matches
GROUP BY team