sql получить общее и отфильтрованное количество в одном запросе - PullRequest
0 голосов
/ 24 октября 2018

Я хочу быть в состоянии сказать, какой процент пользователей для каждой команды имеет более 10 баллов.В настоящее время для этого требуется два запроса:

SELECT COUNT(*) as winners, team FROM users WHERE points > 10 GROUP BY team

SELECT COUNT(*) as total, team FROM users GROUP BY team

Могу ли я сделать это в одном, чтобы получить такой результат:

winners, total, team
5, 16, A

Ответы [ 3 ]

0 голосов
/ 24 октября 2018

Попробуйте это, он просто использует случай, когда вместо фильтрации всего набора данных в предложении where.

SELECT COUNT(*) as total    
, SUM(case when points > 10 then 1 else 0 end) as winners
, team 
FROM users 
GROUP BY team

Может также сделать:

SELECT COUNT(*) as total    
, COUNT(case when points > 10 then 1 else NULL end) as winners
, team 
FROM users 
GROUP BY team
0 голосов
/ 24 октября 2018

Вы можете использовать Case .. When, чтобы проверить, больше ли points для определенной строки, и подсчитать его соответствующим образом (используя Sum()).

SELECT COUNT(*) as total, 
       SUM(CASE WHEN points > 10 THEN 1 ELSE 0 END) AS winners, 
       team 
FROM users 
GROUP BY team

В MySQL мы можем сократить его еще больше, так как Sum() функция может просто приводить результаты условных операторов / функций к 0/1 (для false / true соответственно):

SELECT COUNT(*) as total, 
       SUM(points > 10) AS winners, 
       team 
FROM users 
GROUP BY team
0 голосов
/ 24 октября 2018

вы можете попробовать следующим образом

SELECT COUNT(*) as winners, 
team, (select count(*) from users) as total FROM users 
WHERE points > 10 GROUP BY team

Или вы можете использовать случай, когда

SELECT team, COUNT(*) as total , 
       count(CASE WHEN points > 10 THEN 1 end) AS winners  

FROM users 
GROUP BY team
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...