Como usar a contagem e o grupo na mesma instrução selecione
tenho uma consulta SQL select que tem um grupo por. Quero contar todos os registos depois do grupo por Declaração. Há alguma maneira de fazer isto directamente a partir do sql? Por exemplo, tendo uma tabela com usuários, eu quero selecionar as diferentes cidades e o total Número de Usuários
select town, count(*) from user
group by town
quero ter uma coluna com todas as cidades e outra com o número de utilizadores em todas as linhas.
um exemplo do resultado para ter 3 cidades e 58 utilizadores no total é:
Town Count
Copenhagen 58
NewYork 58
Athens 58
11 answers
Isto fará o que quiser (lista de cidades, com o número de utilizadores em cada uma):
select town, count(town)
from user
group by town
Pode usar a maioria das funções agregadas ao usar GROUP BY
.
Update (após alteração das perguntas e comentários)
Você pode declarar uma variável para o número de usuários e configurá-la para o número de usuários e, em seguida, selecionar com isso.
DECLARE @numOfUsers INT
SET @numOfUsers = SELECT COUNT(*) FROM user
SELECT DISTINCT town, @numOfUsers
FROM user
Pode usar COUNT(DISTINCT ...)
:
SELECT COUNT(DISTINCT town)
FROM user
O outro caminho é:
/* 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
Com a Oracle pode usar funções analíticas:
select town, count(town), sum(count(town)) over () total_count from user
group by town
As suas outras opções são usar um subquery:
select town, count(town), (select count(town) from user) as total_count from user
group by town
Se você quiser pedir por Contagem (parece simples, mas eu não consigo encontrar uma resposta na pilha de como fazer isso) você pode fazer:
SELECT town, count(town) as total FROM user
GROUP BY town ORDER BY total DESC
Você pode usar o distinto dentro do Conde como o que milkovsky disse
No meu caso:
select COUNT(distinct user_id) from answers_votes where answer_id in (694,695);
{[[2]} isto vai puxar a contagem de votos de resposta considerados o mesmo Utilizador que uma contagem
Eu sei que este é um post antigo, no servidor SQL:
select isnull(town,'TOTAL') Town, count(*) cnt
from user
group by town WITH ROLLUP
Town cnt
Copenhagen 58
NewYork 58
Athens 58
TOTAL 174
Se quiser seleccionar a contagem da cidade e do número total de utilizadores, pode usar esta pesquisa abaixo:
SELECT Town, (SELECT Count(*) FROM User) `Count` FROM user GROUP BY Town;
Tente o seguinte código:
select ccode, count(empno)
from company_details
group by ccode;
Se quiser usar a opção seleccionar toda a pesquisa com a contagem, tente isto...
select a.*, (Select count(b.name) from table_name as b where Condition) as totCount from table_name as a where where Condition
Dez respostas não apagadas; a maioria faz Não o que o utilizador pediu. A maioria das respostas mis-leia a pergunta como pensando que existem 58 usuários em cada cidade em vez de 58 no total. Mesmo os poucos que estão corretos não são ideais.
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
+----------------------------+-------+
No contexto do Po:
SELECT town, total_users
FROM ( SELECT DISTINCT town FROM canada ) AS towns
CROSS JOIN ( SELECT COUNT(*) total_users FROM canada ) AS tot;
Uma vez que há apenas uma linha de tot
, o CROSS JOIN
não é tão volumoso como poderia ser de outra forma.
O padrão habitual é COUNT(*)
em vez de COUNT(town)
. Este último implica verificar town
se não é nulo, o que é desnecessário neste contexto.