计算不同的值


78

我有一个数据集,询问客户例如他们有多少只宠物。有一个方法可以查询不同的值(1、2、3等)吗?谢谢!

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

我要的是一个清单说:

  • 2人养了2只宠物
  • 2人养了3只宠物
  • 1只养了4只宠物

Answers:


117

您可以按以下方式进行计数:

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 2011年

我实际上正在寻找原始版本,该解决方案的第一部分对我有用。感谢您不要删除它!
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

0
SELECT CUSTOMER, COUNT(*) as PETS 
FROM table_name 
GROUP BY CUSTOMER;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.