Как использовать count и group by в одной инструкции select
у меня есть запрос SELECT, который имеет группу по. Я хочу, чтобы подсчитать все записи после группы по заявлению. Есть ли способ для этого непосредственно из SQL? Например, имея таблицу с пользователями, я хочу выбрать разные города и в общей сумме количество пользователей
select town, count(*) from user
group by town
Я хочу, чтобы столбец со всеми городами и другого с количеством пользователей во всех строках.
пример результата для наличия 3 городов и 58 пользователей в общей сложности :
Town Count
Copenhagen 58
NewYork 58
Athens 58
11 ответов:
Это будет делать то, что вы хотите (список городов, с числом пользователей в каждой):
select town, count(town) from user group by town
вы можете использовать большинство агрегатные функции при использовании
GROUP BY
.обновление (после изменения на вопрос и комментарии)
можно объявить переменную для количества пользователей и количество пользователей, выберите С что.
DECLARE @numOfUsers INT SET @numOfUsers = SELECT COUNT(*) FROM user SELECT DISTINCT town, @numOfUsers FROM user
можно использовать
COUNT(DISTINCT ...)
:SELECT COUNT(DISTINCT town) FROM user
другой путь:
/* Number of rows in a derived table called d1. */ select count(*) from ( /* Number of times each town appears in user. */ select town, count(*) from user group by town ) d1
С Oracle вы можете использовать аналитические функции:
select town, count(town), sum(count(town)) over () total_count from user group by town
другие ваши варианты-использовать подзапрос:
select town, count(town), (select count(town) from user) as total_count from user group by town
Если вы хотите заказать по количеству (звучит просто, но я не могу найти ответ на стек, как это сделать), вы можете сделать:
SELECT town, count(town) as total FROM user GROUP BY town ORDER BY total DESC
вы можете использовать DISTINCT внутри графа, как то, что сказал Мильковский
в моем случае:
select COUNT(distinct user_id) from answers_votes where answer_id in (694,695);
Это будет тянуть подсчет голосов ответа считается тот же user_id, что и один подсчет
Я знаю, что это старый пост, в SQL Server:
select isnull(town,'TOTAL') Town, count(*) cnt from user group by town WITH ROLLUP Town cnt Copenhagen 58 NewYork 58 Athens 58 TOTAL 174
Если вы хотите выбрать город и общее количество пользователей, вы можете использовать этот запрос ниже:
SELECT Town, (SELECT Count(*) FROM User) `Count` FROM user GROUP BY Town;
Если вы хотите использовать опцию выбрать все запросы с подсчетом, попробуйте это...
select a.*, (Select count(b.name) from table_name as b where Condition) as totCount from table_name as a where where Condition
десять не удаленных ответов; большинство из них не сделайте то, что просил пользователь. Большинство ответов неверно читают вопрос, думая, что вкаждого города вместо 58 в общей сложности. Даже те немногие, которые являются правильными не являются оптимальными.
mysql> flush status; Query OK, 0 rows affected (0.00 sec) SELECT province, total_cities FROM ( SELECT DISTINCT province FROM canada ) AS provinces CROSS JOIN ( SELECT COUNT(*) total_cities FROM canada ) AS tot; +---------------------------+--------------+ | province | total_cities | +---------------------------+--------------+ | Alberta | 5484 | | British Columbia | 5484 | | Manitoba | 5484 | | New Brunswick | 5484 | | Newfoundland and Labrador | 5484 | | Northwest Territories | 5484 | | Nova Scotia | 5484 | | Nunavut | 5484 | | Ontario | 5484 | | Prince Edward Island | 5484 | | Quebec | 5484 | | Saskatchewan | 5484 | | Yukon | 5484 | +---------------------------+--------------+ 13 rows in set (0.01 sec)
SHOW session status LIKE 'Handler%';
+----------------------------+-------+ | Variable_name | Value | +----------------------------+-------+ | Handler_commit | 1 | | Handler_delete | 0 | | Handler_discover | 0 | | Handler_external_lock | 4 | | Handler_mrr_init | 0 | | Handler_prepare | 0 | | Handler_read_first | 3 | | Handler_read_key | 16 | | Handler_read_last | 1 | | Handler_read_next | 5484 | -- One table scan to get COUNT(*) | Handler_read_prev | 0 | | Handler_read_rnd | 0 | | Handler_read_rnd_next | 15 | | Handler_rollback | 0 | | Handler_savepoint | 0 | | Handler_savepoint_rollback | 0 | | Handler_update | 0 | | Handler_write | 14 | -- leapfrog through index to find provinces +----------------------------+-------+
в контексте ОП:
SELECT town, total_users FROM ( SELECT DISTINCT town FROM canada ) AS towns CROSS JOIN ( SELECT COUNT(*) total_users FROM canada ) AS tot;
так как есть только одна строка из
tot
наCROSS JOIN
не так объемно, как могло бы быть иначе быть.обычная картина
COUNT(*)
вместоCOUNT(town)
. Последнее подразумевает проверкуtown
для того, чтобы быть не нулевым, что в этом контексте не нужно.