web-dev-qa-db-fra.com

Comment utiliser count et group by en même temps une instruction select

J'ai une requête select SQL qui a un groupe par. Je veux compter tous les enregistrements après la déclaration group by. Y at-il un moyen pour cela directement à partir de SQL? Par exemple, en ayant une table avec les utilisateurs total nombre d'utilisateurs

select town, count(*) from user
group by town

Je veux avoir une colonne avec toutes les villes et une autre avec le nombre d'utilisateurs dans toutes les lignes.

Voici un exemple de résultat obtenu avec 3 villes et 58 utilisateurs:

Town         Count
Copenhagen   58
NewYork      58
Athens       58
195
Stavros

Cela fera ce que vous voulez (liste des villes, avec le nombre d'utilisateurs dans chacune):

select town, count(town) 
from user
group by town

Vous pouvez utiliser la plupart des fonctions d'agrégat avec GROUP BY.

Update (après modification de la question et des commentaires)

Vous pouvez déclarer une variable pour le nombre d'utilisateurs et la définir pour le nombre d'utilisateurs, puis la sélectionner.

DECLARE @numOfUsers INT
SET @numOfUsers = SELECT COUNT(*) FROM user

SELECT DISTINCT town, @numOfUsers
FROM user
254
Oded

Vous pouvez utiliser COUNT(DISTINCT ...)

SELECT COUNT(DISTINCT town) 
FROM user
132
milkovsky

L'autre façon est:

/* 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
ZhenYu Wang

Avec Oracle, vous pouvez utiliser des fonctions analytiques:

select town, count(town), sum(count(town)) over () total_count from user
group by town

Vos autres options consistent à utiliser une sous-requête:

select town, count(town), (select count(town) from user) as total_count from user
group by town
3
Tommi

Vous pouvez utiliser DISTINCT dans COUNT comme ce que dit milkovsky

dans mon cas:

select COUNT(distinct user_id) from answers_votes where answer_id in (694,695);

Cela va tirer le nombre de votes de réponse considéré comme le même user_id comme un compte

2
Jur P

Je sais que c'est un ancien post, dans 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
2
Marcus

Si vous voulez commander par nombre (cela semble simple mais je ne peux pas trouver de réponse quant à la manière de le faire), vous pouvez faire:

        SELECT town, count(town) as total FROM user
        GROUP BY town ORDER BY total DESC
2
sagits

Dix réponses non supprimées; la plupart font pas font ce que l'utilisateur a demandé. La plupart des réponses ont mal interprété la question en pensant qu'il y avait 58 utilisateurs dans chaque ville au lieu de 58 au total. Même les rares corrects ne sont pas optimaux.

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  
+----------------------------+-------+

Dans le contexte du PO:

SELECT  town, total_users
    FROM       ( SELECT  DISTINCT town  FROM  canada ) AS towns
    CROSS JOIN ( SELECT  COUNT(*) total_users  FROM  canada ) AS tot;

Comme il n'y a qu'une seule ligne dans tot, le CROSS JOIN n'est pas aussi volumineux qu'il pourrait l'être autrement.

Le modèle habituel est COUNT(*) au lieu de COUNT(town). Ce dernier implique de vérifier que town n’est pas nul, ce qui est inutile dans ce contexte.

1
Rick James

Si vous souhaitez sélectionner la ville et le nombre total d'utilisateurs, vous pouvez utiliser la requête ci-dessous:

SELECT Town, (SELECT Count(*) FROM User) `Count` FROM user GROUP BY Town;
1
Violendy Firdaus

si vous souhaitez utiliser l'option Sélectionner toutes les requêtes avec nombre, essayez ceci ...

 select a.*, (Select count(b.name) from table_name as b where Condition) as totCount from table_name  as a where where Condition
0
Prakash

Essayez le code suivant:

select ccode, count(empno) 
from company_details 
group by ccode;
0
balajibran