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 BY
gebruikt.
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 JOIN
niet zo omvangrijk als het anders zou zijn.
Het gebruikelijke patroon is COUNT(*)
in plaats van COUNT(town)
. Dit laatste houdt in dat town
moet 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;