У меня есть запрос на выбор sql, у которого есть группа. Я хочу считать все записи после оператора group. Есть ли способ для этого непосредственно из sql? Например, имея таблицу с пользователями, я хочу выбрать разные города и общее количество пользователей
select town, count(*) from user
group by town
Я хочу иметь столбец со всеми городами, а другой с количеством пользователей во всех строки.
Примером результата для трех городов и 58 пользователей является:
Town Count
Copenhagen 58
NewYork 58
Athens 58
Попробуйте использовать следующий код:
select ccode, count(empno)
from company_details
group by ccode;
Вы можете использовать DISTINCT внутри COUNT, как то, что сказал Милковский
в моем случае:
select COUNT(distinct user_id) from answers_votes where answer_id in (694,695);
Это приведет к тому, что подсчет голосов будет считаться одним и тем же user_id как один счет
Другой способ:
/* 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
Я знаю, что это старый пост в 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
Вы можете использовать COUNT(DISTINCT ...):
SELECT COUNT(DISTINCT town)
FROM user
, если вы хотите использовать Select All Query With Count Option, попробуйте это ...
select a.*, (Select count(b.name) from table_name as b where Condition) as totCount from table_name as a where where Condition
Десять не удаленных ответов; большинство из них не делают то, что попросил пользователь. Большинство ответов неверно читают вопрос, поскольку думают, что в каждом городе 58 пользователей, а не 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
+----------------------------+-------+
В контексте OP:
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 за то, что оно не является нулевым, что в этом контексте не нужно.
Если вы хотите заказать по счету (звук простой, но я не могу найти ответ на стек о том, как это сделать), вы можете сделать:
SELECT town, count(town) as total FROM user
GROUP BY town ORDER BY total DESC
Если вы хотите выбрать город и общее количество пользователей, вы можете использовать этот запрос ниже:
SELECT Town, (SELECT Count(*) FROM User) `Count` FROM user GROUP BY Town;
С 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