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
Author: Stavros, 2010-04-27

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
 240
Author: Oded, 2018-05-28 09:17:32

Pode usar COUNT(DISTINCT ...) :

SELECT COUNT(DISTINCT town) 
FROM user
 130
Author: milkovsky, 2017-10-30 09:57:59

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
 31
Author: ZhenYu Wang, 2016-10-14 23:36:21

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
 3
Author: Tommi, 2010-04-28 07:02:23

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
 2
Author: sagits, 2013-12-18 18:22:45

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
 2
Author: Jur P, 2014-10-06 05:47:31

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
 2
Author: Marcus, 2016-03-12 00:31:04

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;
 1
Author: Violendy Firdaus, 2014-10-14 07:19:31

Tente o seguinte código:

select ccode, count(empno) 
from company_details 
group by ccode;
 0
Author: balajibran, 2015-04-06 09:47:26

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
 0
Author: Prakash, 2017-12-05 12:27:15

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.

 0
Author: Rick James, 2018-07-07 19:55:21