2016-07-27 4 views
0

У меня есть этот запрос:MySQL Количество подзапросов на одной таблице

SELECT `facilities`.`name` AS facility, `countries`.`name` AS country, `states`.`name` AS state, `users`.`dosage` AS dosage, COUNT(`users`.`id`) AS registrations 
FROM `users` 
LEFT JOIN `countries` ON `users`.`country_id` = `countries`.`id` 
LEFT JOIN `states` ON `users`.`state_id` = `states`.`id` LEFT JOIN `user_facilities` ON `users`.`id` = `user_facilities`.`user_id` 
LEFT JOIN `facilities` ON `user_facilities`.`facility_id` = `facilities`.`id` 
WHERE `users`.`dosage` != "Not sure" 
GROUP BY `facilities`.`name`, `countries`.`name`, `states`.`name`, `users`.`dosage` 
ORDER BY `facilities`.`id` ASC, `countries`.`id` ASC, `states`.`name` ASC 

Это дает мне этот результат:

Hospital | United States | Arkansas | 10 doses | 3  
Hospital | United States | Arkansas | >10 doses | 4  
Home care | United States | Arkansas | 10 doses | 1  
Home care | United States | Texas | 10 doses | 1 

Мои пользователи таблицы: идентификатор | электронная почта | state_id | country_id | дозировка | percent_completed

Что мне нужно сделать, так это получить количество пользователей с процентом_полностью = 100 для каждого результата. Я пробовал подзапросы, но я не мог найти правильный подзапрос для этого. Я застрял. Есть ли у кого-нибудь совет? Спасибо.

+0

Может вы даете нам структуру и некоторые примеры данных как sql-заявления? – Philipp

ответ

2

Если я правильно понимаю, вы можете использовать условную агрегацию. В MySQL вы можете просто сделать:

select . . ., 
     sum(percent_completed = 100) as num_at_100 
+0

Большое вам спасибо, это делает именно то, что мне нужно :) – mihaela

1

После группы пожалуйста, добавьте «имеющую сумму (percent_completed)> = 100», который будет считать, что вы пользователи, которые будут завершены> = 100 процентами

SELECT `facilities`.`name` AS facility, `countries`.`name` AS country, `states`.`name` AS state, `users`.`dosage` AS dosage, COUNT(`users`.`id`) AS registrations 
FROM `users` 
LEFT JOIN `countries` ON `users`.`country_id` = `countries`.`id` 
LEFT JOIN `states` ON `users`.`state_id` = `states`.`id` LEFT JOIN `user_facilities` ON `users`.`id` = `user_facilities`.`user_id` 
LEFT JOIN `facilities` ON `user_facilities`.`facility_id` = `facilities`.`id` 
WHERE `users`.`dosage` != "Not sure" 
GROUP BY `facilities`.`name`, `countries`.`name`, `states`.`name`, `users`.`dosage` having sum(users.percentage_completed) >= 100 
ORDER BY `facilities`.`id` ASC, `countries`.`id` ASC, `states`.`name` ASC 
+0

Спасибо за ваши ответы. «Уметь» удаляет данные, где %_полное равен 0. Условная агрегация решила мою проблему :) – mihaela