인프런 커뮤니티 질문&답변

asusman님의 프로필 이미지
asusman

작성한 질문수

다양한 사례로 익히는 SQL 데이터 분석

주문별 고객별 연관 상품 추출 SQL로 구하기 - 02

count(*)와 count(distinct order_id)의 차이점이 궁금합니다.

작성

·

594

0

훌륭한 강의를 듣고 있는 와중에 궁금점이 생겼습니다.

 

group by 를 수행한 후에 주문 건수를 집계할 때 count(*) 함수 혹은 count(distinct order_id)를 사용하시던데,

 

주문 번호가 중복되어있을 경우에는 distinct 함수를 통해 중복을 제거후 count() 집계를 사용해야 된다고 알고 있습니다.

그런데 

order별 특정 상품 주문시 함께 가장 많이 주문된 다른 상품 추출하기 쿼리에서,

select prod_01, prod_02, count(*)

from temp_01

group by prod_01, prod_02

부분을 보면 count(*)를 사용한 것이 이해가 잘 가지 않습니다 ㅠㅠ

그 앞의 temp_01 절에서 ga.order_items 테이블을 사용하는 데 해당 테이블에는 order_id가 중복되어 있는 것으로 알고 있습니다. 그러면 후에 건수 집계시 count(distinct temp_01.order_id)로 해야 하는 것이 아닌가 궁금합니다.

아니면 count(*)의 의미가 애초에 주문 건수를 의미하는 것이 아닌지 궁금합니다.

늘 수고 많으십니다.

 

답변 1

1

권 철민님의 프로필 이미지
권 철민
지식공유자

안녕하십니까, 

count(*)가 주문건수는 아닙니다. 

temp_01에서 만드는 집합은 order_items를 order_id로 셀프 조인해서 만들어 지는데, 이 집합의 레벨을 규정하는게 사실 좀 어렵습니다. 

굳이 정의하자만 동일 주문번호에서 주문 상품과 다른 주문 상품간의 관계정도가 됩니다.  

그러니까 PK레벨로 보자면 주문번호 + 특정주문 상품 + 동일 주문상의 다른 주문 상품 이라고 볼수 있습니다. 

예를 들어 order_items가 특정 주문 번호 001로 아래와 같은 세개의 주문 상품들 A, B, C를  주문했다고 한다면

주문번호 상품

001         A         

001         B

001         C

이를 이용해 만들어지는 temp_01은 동일 주문번호에서 개별 주문 상품별로 같이 주문된 상품들의 관계 집합 레벨로 아래와 같이 만들어 집니다.  

주문번호 기준상품코드  같이 주문된 상품코드

001                     A                            B

001                    A                             C

001                    B                             A

001                    B                             C

001                    C                             A

001                    C                             B

이 temp_01을 가지고 count(distinct 상품코드)를 이용하여 상품별 주문 건수를 계산할 수는 있습니다.  하지만 구하고자 하는 목표가 그건 아닙니다.  기준 상품 코드 별로 같이 주문된 상품코드가 몇건인지를 찾아내고 이를 이용해서 같이 주문이 많이된 연관 상품들을 추출하고자 함입니다.  

때문에 이를 구하기 위해서 group by 기준상품코드, 같이주문된 상품코드를 적용한 것입니다. 

구하고자 하는 목표가 다르기 때문에 count( distinct 상품코드)를 적용하지 않은 것입니다. 

 

asusman님의 프로필 이미지
asusman
질문자

답변 감사합니다. 이해가 됐습니다.

안녕하세요?

count(*)와 count(distinct order_id)는 동일한 결과를 내는 쿼리가 아닌지요?

join 후에 order_id는 여러 row에 나타나지만,

상품 A, B에 대해서는 order_id가 1회만 나타나기 때문에 count(*)를 하던 count(distinct order_id)를 하던 동일한 것이 아닌지요?

 

asusman님의 프로필 이미지
asusman

작성한 질문수

질문하기