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
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
Vous pouvez utiliser COUNT(DISTINCT ...)
:
SELECT COUNT(DISTINCT town)
FROM user
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
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
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
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
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
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.
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;
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
Essayez le code suivant:
select ccode, count(empno)
from company_details
group by ccode;