web-dev-qa-db-de.com

Verwendung von count und group by bei derselben select-Anweisung

Ich habe eine SQL-Auswahlabfrage, die eine Gruppe von hat. Ich möchte alle Datensätze nach der group by -Anweisung zählen. Gibt es dafür einen Weg direkt aus SQL? Zum Beispiel, wenn Sie eine Tabelle mit Benutzern haben, möchte ich die verschiedenen Städte auswählen gesamt Anzahl der Nutzer

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

Ich möchte eine Kolumne mit allen Städten und eine weitere mit der Anzahl der Benutzer in allen Zeilen.

Ein Beispiel für das Ergebnis mit 3 Städten und insgesamt 58 Nutzern ist:

Town         Count
Copenhagen   58
NewYork      58
Athens       58
195
Stavros

Dies wird tun, was Sie wollen (Liste der Städte mit der Anzahl der Benutzer):

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

Sie können die meisten Aggregatfunktionen verwenden , wenn Sie GROUP BY verwenden.

Update (nach Änderung der Frage und der Kommentare)

Sie können eine Variable für die Anzahl der Benutzer deklarieren und auf die Anzahl der Benutzer festlegen, die Sie dann auswählen.

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

SELECT DISTINCT town, @numOfUsers
FROM user
254
Oded

Sie können COUNT(DISTINCT ...) verwenden: 

SELECT COUNT(DISTINCT town) 
FROM user
132
milkovsky

Der andere Weg ist:

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

Mit Oracle können Sie analytische Funktionen verwenden:

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

Ihre andere Option ist die Verwendung einer Unterabfrage:

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

Sie können DISTINCT innerhalb des COUNT verwenden, wie es von milkovsky gesagt wurde

in meinem Fall:

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

Dadurch wird die Anzahl der Antwortstimmen gezählt, die dieselbe user_id als eine Zählung betrachtet

2
Jur P

Ich weiß, dass dies ein alter Beitrag in SQL Server ist:

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

Wenn Sie nach Zählung bestellen möchten (klingt einfach, aber ich habe keine Antwort darauf gefunden), können Sie Folgendes tun:

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

Zehn nicht gelöschte Antworten; Die meisten tun nicht tun, was der Benutzer verlangt hat. Die meisten Antworten lesen die Frage falsch, weil sie denken, dass 58 Benutzer in jeder Stadt statt 58 insgesamt sind. Sogar die wenigen, die richtig sind, sind nicht optimal.

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

Im Zusammenhang mit dem OP:

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

Da es nur eine Zeile von tot gibt, ist der CROSS JOIN nicht so umfangreich wie es sonst sein könnte.

Das übliche Muster ist COUNT(*) anstelle von COUNT(town). Letzteres setzt voraus, town auf Nichtnull zu prüfen, was in diesem Zusammenhang nicht erforderlich ist.

1
Rick James

Wenn Sie den Ort und die Gesamtzahl der Benutzer auswählen möchten, können Sie die folgende Abfrage verwenden:

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

wenn Sie "Alle Abfragen mit Zählungsoption auswählen" verwenden möchten, versuchen Sie Folgendes ...

 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

Versuchen Sie den folgenden Code:

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