Zählen Sie unterschiedliche Werte

78

Ich habe einen Datensatz, in dem ein Kunde gefragt wird, wie viele Haustiere er beispielsweise hat. Gibt es eine Möglichkeit, mit einer Abfrage die verschiedenen Werte (1,2,3 usw.) zu zählen? Vielen Dank!

+----------+------+
| Customer | Pets |
+----------+------+
|       20 |    2 |
|       21 |    3 |
|       22 |    3 |
|       23 |    2 |
|       24 |    4 |
+----------+------+

Was ich will, ist eine Liste mit folgenden Worten:

  • 2 hatten 2 Haustiere
  • 2 hatten 3 Haustiere
  • Ich hatte 4 Haustiere
Willlangford
quelle

Antworten:

117

Sie können wie folgt eindeutig zählen:

SELECT COUNT(DISTINCT column_name) FROM table_name;

BEARBEITEN:

Nach Ihrer Klärung und Aktualisierung der Frage sehe ich jetzt, dass es sich um eine ganz andere Frage handelt, als wir ursprünglich gedacht hatten. "DISTINCT" hat in SQL eine besondere Bedeutung. Wenn ich das richtig verstehe, möchten Sie so etwas:

  • 2 Kunden hatten 1 Haustiere
  • 3 Kunden hatten 2 Haustiere
  • 1 Kunde hatte 3 Haustiere

Jetzt möchten Sie wahrscheinlich eine Unterabfrage verwenden:

select COUNT(*) column_name FROM (SELECT DISTINCT column_name);

Lassen Sie mich wissen, wenn dies nicht ganz das ist, wonach Sie suchen.

Fibericon
quelle
Ich hatte das vorher mit null Glück versucht. Hier ist ein Beispiel meiner Daten; Kunde | Haustiere 20 | 2 21 | 3 22 | 3 23 | 2 24 | 4 Was ich will, ist eine Liste, die sagt: 2 hatte 2 Haustiere 2 hatte 3 Haustiere 1 hatte 4 Haustiere
Willlangford
Ich habe tatsächlich nach der Originalversion gesucht und der erste Teil dieser Lösung hat für mich funktioniert. Danke, dass du es nicht gelöscht hast!
D. Strout
8
Die bearbeitete Abfrage funktioniert bei mir nicht, da sie den Tabellennamen nicht enthält. Oder fehlt mir etwas?
Evan Hobbs
50

Ok, ich habe meine vorherige Antwort gelöscht, weil es schließlich nicht das war, wonach Willlangford suchte, aber ich habe darauf hingewiesen, dass wir vielleicht alle die Frage falsch verstanden haben.

SELECT DISTINCT...Anfangs dachte ich auch an die Sache, aber es schien mir zu seltsam, dass jemand wissen musste, wie viele Menschen eine andere Anzahl von Haustieren hatten als die anderen ... deshalb dachte ich, dass die Frage vielleicht nicht klar genug war.

Nun, da die eigentliche Fragebedeutung geklärt ist und eine Unterabfrage dafür einen ziemlichen Aufwand darstellt, würde ich vorzugsweise eine GROUP BYKlausel verwenden.

Stellen Sie sich vor, Sie haben den Tisch customer_petsso:

+-----------------------+
|  customer  |   pets   |
+------------+----------+
| customer1  |    2     |
| customer2  |    3     |
| customer3  |    2     |
| customer4  |    2     |
| customer5  |    3     |
| customer6  |    4     |
+------------+----------+

dann

SELECT count(customer) AS num_customers, pets FROM customer_pets GROUP BY pets

würden zurückkehren:

+----------------------------+
|  num_customers  |   pets   |
+-----------------+----------+
|        3        |    2     |
|        2        |    3     |
|        1        |    4     |
+-----------------+----------+

wie du es brauchst.

maid450
quelle
1
Der Spaltenname in count(customer)ist überflüssig. Sie können nur verwenden:SELECT COUNT(*) AS num_customers, pets FROM customer_pets GROUP BY pets
Sgussman
6
@sgussman Nicht excactly, wenn Sie erlauben , NULL - Werte für customerdann COUNT(customer)werden sie nicht zählen, während COUNT(*)oder COUNT(pets)will. In diesem Fall hängt es davon ab, welches Verhalten Sie bevorzugen. Auf jeden Fall, auch wenn es die meiste Zeit keinen Unterschied macht, möchte ich die Spalte angeben, die ich für die Lesbarkeit zählen möchte.
maid450
1

Ich finde diesen Link ziemlich gut.

Beispielausgabe von diesem Link:

mysql> SELECT cate_id,COUNT(DISTINCT(pub_lang)), ROUND(AVG(no_page),2)
    -> FROM book_mast
    -> GROUP BY cate_id;
+---------+---------------------------+-----------------------+
| cate_id | COUNT(DISTINCT(pub_lang)) | ROUND(AVG(no_page),2) |
+---------+---------------------------+-----------------------+
| CA001   |                         2 |                264.33 | 
| CA002   |                         1 |                433.33 | 
| CA003   |                         2 |                256.67 | 
| CA004   |                         3 |                246.67 | 
| CA005   |                         3 |                245.75 | 
+---------+---------------------------+-----------------------+
5 rows in set (0.00 sec)
Hayatbiralem
quelle
1

Sie können dies verwenden:

select count(customer) as count, pets
from table
group by pets
VSJ
quelle
0
SELECT CUSTOMER, COUNT(*) as PETS 
FROM table_name 
GROUP BY CUSTOMER;
A. Sharma
quelle