고유 값 계산


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
마리

실제로 원래 버전을 찾고 있었고이 솔루션의 첫 번째 부분이 저에게 효과적이었습니다. 삭제하지 않으셔서 감사합니다!
D. Strout 2013

8
편집 된 쿼리는 테이블 이름이 포함되어 있지 않기 때문에 작동하지 않습니까? 아니면 내가 뭔가를 놓치고 있습니까?
Evan Hobbs

50

좋아, 마침내 willlangford가 찾고 있던 것이 아니기 때문에 이전 답변을 삭제했지만 우리 모두가 그 질문을 오해하고 있다고 지적했습니다.

나도 처음에는 생각 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하지 excactly, 당신이 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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.