计算不同的值

wil*_*ord 74 mysql sql

我有一个数据集,询问客户他们有多少宠物.有一种方法可以使用一个查询来计算不同的值(1,2,3等)吗?谢谢!

+----------+------+
| Customer | Pets |
+----------+------+
|       20 |    2 |
|       21 |    3 |
|       22 |    3 |
|       23 |    2 |
|       24 |    4 |
+----------+------+
Run Code Online (Sandbox Code Playgroud)

我想要的是一份清单:

  • 2有2只宠物
  • 2有3只宠物
  • 1有4个宠物

Fib*_*con 112

您可以按如下方式进行明确计算:

SELECT COUNT(DISTINCT column_name) FROM table_name;
Run Code Online (Sandbox Code Playgroud)

编辑:

在您澄清并更新问题之后,我现在看到这是一个与我们原先想到的完全不同的问题."DISTINCT"在SQL中具有特殊含义.如果我理解正确,你想要这样的东西:

  • 2位顾客共有1只宠物
  • 3位客户有2只宠物
  • 1位顾客有3只宠物

现在你可能想要使用子查询:

select COUNT(*) column_name FROM (SELECT DISTINCT column_name);
Run Code Online (Sandbox Code Playgroud)

如果这不是您想要的,请告诉我.

  • 编辑后的查询对我不起作用,因为它不包含表名?或者我错过了什么? (6认同)
  • 做一个子查询?我认为对于这样一个简单的任务而言,其开销太大了。 (2认同)

mai*_*450 49

好吧,我删除了我以前的答案,因为最后它不是willlangford想要的,但我明白我可能都误解了这个问题.

起初我也想到了这个SELECT DISTINCT...问题,但对我来说,有人需要知道有多少人拥有与其他人不同的宠物,这似乎太奇怪......这就是为什么我认为这个问题可能不够明确.

所以,既然明确了真正的问题含义,为此制作一个子查询是一个相当大的开销,我最好使用一个GROUP BY条款.

想象一下,你有这样的表customer_pets:

+-----------------------+
|  customer  |   pets   |
+------------+----------+
| customer1  |    2     |
| customer2  |    3     |
| customer3  |    2     |
| customer4  |    2     |
| customer5  |    3     |
| customer6  |    4     |
+------------+----------+
Run Code Online (Sandbox Code Playgroud)

然后

SELECT count(customer) AS num_customers, pets FROM customer_pets GROUP BY pets
Run Code Online (Sandbox Code Playgroud)

会回来:

+----------------------------+
|  num_customers  |   pets   |
+-----------------+----------+
|        3        |    2     |
|        2        |    3     |
|        1        |    4     |
+-----------------+----------+
Run Code Online (Sandbox Code Playgroud)

如你所愿.

  • @sgussman不完全是,如果你允许`customer`的NULL值,那么`COUNT(customer)`将不计算它们,而`COUNT(*)`或`COUNT(pets)`将.在这种情况下,它取决于您喜欢的行为.在任何情况下,即使它在大多数时间没有区别,我也想指定我想要计算可读性的列. (6认同)