Підрахуйте різні значення


79

У мене є набір даних із запитом у клієнта, скільки домашніх тварин у них є, наприклад. Чи є спосіб за допомогою одного запиту я порахувати різні значення (1,2,3 тощо)? Дякую!

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

Що я хочу, це список, який говорить:

  • У 2 було 2 домашніх тварини
  • У 2 було 3 домашніх тварини
  • У 1 було 4 домашніх тварини

Відповіді:


118

Ви можете зробити окремий підрахунок наступним чином:

SELECT COUNT(DISTINCT column_name) FROM table_name;

РЕДАГУВАТИ:

Після вашого роз’яснення та оновлення питання я бачу зараз, що це зовсім інше питання, ніж ми спочатку думали. "DISTINCT" має особливе значення в SQL. Якщо я правильно розумію, ви хочете щось подібне:

  • У 2 клієнтів було 1 домашня тварина
  • У 3 клієнтів було 2 домашніх тварини
  • 1 клієнт мав 3 домашніх тварин

Тепер ви, мабуть, захочете використовувати підзапит:

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

Повідомте мене, якщо це не зовсім те, що ви шукаєте.


Я спробував це попереднє з нульовою удачею. Ось приклад моїх даних; Клієнт | Домашні тварини 20 | 2 21 | 3 22 | 3 23 | 2 24 | 4 Що я хочу, це список, в якому говориться: 2 мали 2 домашніх тварин 2 мали 3 домашніх тварин 1 мали 4 домашніх тварин
willlangford

Я насправді шукав оригінальну версію, і перша частина цього рішення працювала для мене. Дякуємо, що не видалили!
D. Strout

8
Відредагований запит не працює для мене, оскільки він не містить назви таблиці? Або мені чогось не вистачає?
Еван Хоббс,

50

Гаразд, я видалив свою попередню відповідь, тому що нарешті це було не те, що шукав Віллангфорд, але я твердив, що, можливо, ми всі не розуміли питання.

SELECT DISTINCT...Спочатку я теж про це думав , але мені здалося надто дивним, що хтось повинен знати, скільки людей має іншу кількість домашніх тварин, ніж інші ... саме тому я подумав, що, можливо, питання було недостатньо зрозумілим.

Отже, тепер, коли справжнє значення питання з’ясовано, що робить підзапит для цього досить накладними, я б бажав використовувати GROUP BYпункт.

Уявіть, у вас така таблиця customer_pets:

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

тоді

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

повернеться:

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

як вам потрібно.


1
Назва стовпця в count(customer)зайва. Ви можете просто скористатися:SELECT COUNT(*) AS num_customers, pets FROM customer_pets GROUP BY pets
sgussman

6
@sgussman Не точно, якщо ви дозволите значення NULL для, customerтоді COUNT(customer)їх не буде враховувати, в той час як COUNT(*)або COUNT(pets)буде. У цьому випадку це залежить від того, яку поведінку ви віддаєте перевагу. У будь-якому випадку, навіть якщо це не має значення більшу частину часу, мені подобається вказувати стовпець, який я хочу порахувати для читабельності.
maid450

1

Я думаю, що це посилання досить добре.

Зразок вихідних даних за цим посиланням:

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)

1

Ви можете використовувати це:

select count(customer) as count, pets
from table
group by pets

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.