Hoe gebruik je count en group by op hetzelfde select-statement

Ik heb een sql select-query met een group by.
Ik wil alle records na de groep per statement tellen.
Is er een manier om dit rechtstreeks vanuit sql te doen?
Als ik bijvoorbeeld een tabel met gebruikers heb, wil ik de verschillende steden en het totaleaantal gebruikers

selecteren

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

Ik wil een kolom hebben met alle steden en een andere met het aantal gebruikers in alle rijen.

Een voorbeeld van het resultaat voor het hebben van 3 steden en 58 gebruikers in totaal is:

Town         Count
Copenhagen   58
NewYork      58
Athens       58

Antwoord 1, autoriteit 100%

Dit doet wat je wilt (lijst met steden, met het aantal gebruikers in elk):

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

Je kunt de meeste aggregaatfunctiesgebruiken wanneer je GROUP BYgebruikt.

Update(na wijziging in vraag en opmerkingen)

Je kunt een variabele declareren voor het aantal gebruikers en deze instellen op het aantal gebruikers en daarmee selecteren.

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

Antwoord 2, autoriteit 56%

Je kunt COUNT(DISTINCT ...):

SELECT COUNT(DISTINCT town) 
FROM user

Antwoord 3, autoriteit 14%

De andere manier is:

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

Antwoord 4, autoriteit 2%

Tien niet-verwijderde antwoorden; de meesten doen nietwaar de gebruiker om vroeg. De meeste antwoorden lezen de vraag verkeerd omdat ze denken dat er 58 gebruikers zijn in elkestad in plaats van 58 in totaal. Zelfs de weinige die correct zijn, zijn niet optimaal.

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

In de context van de OP:

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

Aangezien er slechts één rij is van tot, is de CROSS JOINniet zo omvangrijk als het anders zou zijn.

Het gebruikelijke patroon is COUNT(*)in plaats van COUNT(town). Dit laatste houdt in dat townmoet worden gecontroleerd op niet nul, wat in deze context niet nodig is.


Antwoord 5, autoriteit 2%

Met Oracle kunt u analytische functies gebruiken:

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

Uw andere opties zijn om een ​​subquery te gebruiken:

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

Antwoord 6

Als u wilt bestellen op telling (geluid eenvoudig, maar ik kan geen antwoord vinden op stapel van hoe u dat moet doen) u kunt doen:

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

Antwoord 7

U kunt verschillend in de graaf gebruiken zoals wat Milkovsky zei

In mijn geval:

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

Hiermee wordt de telling van antwoordstemmen gevolgd als dezelfde gebruikersnaam als één tellen


Antwoord 8

Ik weet dat dit een oude post is, in 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

Antwoord 9

Als u Town en Total Gebruikerscellen wilt selecteren, kunt u deze query hieronder gebruiken:

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

Antwoord 10

Als u wilt gebruiken Selecteer alle query met teloptie, probeer dit dan …

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

Antwoord 11

Probeer de volgende code:

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

Other episodes