0. DISTINCT를 Group by절처럼 사용해도 되는 걸까?
먼저 Group by와 DISTINCT가 무엇인지 간단히 살펴보자.
▶ Group by절 기본구조 및 사용법
: 카테고리 별(소그룹 별) 데이터 결과값을 보고 싶을 때 Group by 사용.
: Group by절을 사용하면, 여러 행에 나열되어 있던 중복 데이터가 제거되고 하나의 데이터가 됨.
SELECT 그룹화한 컬럼명 # Group by절에 적었던 컬럼명
집계함수(그룹화한 칼럼명) # 그룹화한 컬럼의 집계 값
FROM 테이블명
WHERE 조건절 # 테이블 전체 데이터를 조회할 때 적용하고 싶은 조건이 있으면 사용
Group by 그룹화할 컬럼명 # 원하는 소그룹 별 집계 결과값을 보고 싶을 때 사용
Having 조건절 # Group by절로 나눠진 소그룹 안의 데이터에 적용하고 싶은 조건이 있으면 사용
[참고 게시글]
[IT 교육/SQL] - SQL | Group By절과 집계 함수는 한 세트
SQL | Group By절과 집계 함수는 한 세트 | 집계 함수 사용 시 주의 사항
0. Group by절과 집계함수의 연관성 Group by절을 사용하는 이유는 카테고리 별로 데이터들을 모아보고 싶기 때문일 것이다. 그런데 Group by로 카테고리를 묶게되면 필연적으로 해당 카테고리에 속했
nasena.tistory.com
▶ DISTINCT 사용법
: 중복 데이터 제거. 같은 값을 가지는 여러 데이터를 한 건으로 간주함.
: COUNT(DISTINCT 컬럼명) 형식처럼 집계함수와 함께 쓰일 수 있음.
여기서 문제!
Group by절과 DISTINCT는 모두 중복 데이터를 제거해서 하나로 합쳐준다는 기능이 있다.
Q. 그렇다면 Group by절로 도출한 결과값을 DISTINCT로도 똑같이 낼 수 있을까?
이 질문을 시작으로,, DISTINCT와 Group by 사용법에 대한 뜻밖의 여정을 시작하게 됨,,
DISTINCT와 Group By에 대한 뜻밖의 여정..
1. Group By로 도출한 결과를 DISTINCT로도 똑같이 낼 수 있을까?
(문제) food_orders 테이블에서 ①음식점 명 별 / ②총 수량과 / ③총 가격 구하기
1-1) Group by절 사용
▶ Group by절로 음식점 명을 그룹화해주고,
집계함수 SUM으로 음식점 별 주문받은 수량의 합과 가격의 합을 구함.
: restaurant_name(음식점 명) 별 quantity(수량)과 price(가격)의 합
SELECT restaurant_name,
SUM(quantity) total_quantity,
SUM(price) total_price
FROM food_orders fo
Group By 1
>> 음식점 명 별 주문수량과 가격의 합계가 잘 조회된 것을 볼 수 있음.
Q. 그렇다면 이런 결과를 DISTINCT로도 똑같이 만들어 낼 수 있지 않을까?
1-2) DISTINCT 사용
_ SELECT문에 [DISTINCT + 집계함수] 조합 적용
▶ DISTINCT로 음식점 명 별로 중복제거 한 뒤, 집계함수로 주문수량과 가격의 총 합을 구함
: 먼저 DISTINCT로 음식점 명이 중복제거 되고나면,
그 뒤에 수량과 가격에 대한 합계가 조회될 때 앞서 중복제거된 음식점 명 별로 합계가 조회될 줄 알았는데..
안 됨 !
SELECT DISTINCT restaurant_name,
SUM(quantity) ,
SUM(price)
FROM food_orders fo
>> 음식점이 Hangawi 외에도 많았는데 다짜고짜 하나의 값으로 집약된 결과를 보여줌.
>> 여기에 출력된 total_quantity(총 수량 합계)의 5,673과
total_price(총 가격 합계)의 31,314,820은
테이블 전체 데이터의 총 수량 합계와 총 가격 합계임.
(예상 밖의 결과에.. 잠시 동공지진.. ⊙-⊙;;)
2. 이런 결과가 나온 이유는??
A1.
: DISTINCT에는 중복을 제거해주는 기능은 있지만
Group By절과 같이 카테고리 별로 묶어주는 기능은 없는 것으로 보임.
A2.
: DISTINCT가 SELECT절에서 조회되면서 활성화되다보니
일단 쿼리문 순서에 따라서 음식점 명 별로 중복제거가 되었지만,
그 뒤에 연달아 집계함수가 조회되면서 이전의 결과값은 날아가고, 집계된 결과만 출력된 것 같음.
혹시 이 결론이 틀렸다면 데이터베이스, SQL 고수님들,, 댓글로 가르침을 주십셔,,.
3. 그 외 DISTINCT에 대한 탐구
3-1) DISTINCT 만 사용한 결과는 어떻게 나올까?
▶ 순수 DISTINCT
: restaurant_name(음식점 명)이 중복 제거
SELECT DISTINCT restaurant_name
FROM food_orders fo
>> 중복되는 음식점 없이 잘 조회됨.
▶ DISTINCT + 집계함수를 뺀 순수 컬럼
: 이번에는 DISTINCT와 함께 집계함수를 뺀 순수 컬럼을 같이 조회해봄.
: 너무 당연하게 DISTINCT로 음식점 명이 중복 제거..됐겠지 했는데
안 됨!
: 그 이유는 밑에 기술.
SELECT DISTINCT restaurant_name,
quantity ,
price
FROM food_orders fo
>> DISTINCT가 음식점 명에만 적용된 게 아니라 [음식점 명, 수량, 가격]의 조합에 적용되어서
이 세 가지 값이 모두 같은 경우에만 중복된 값으로 인식해서 제거해줌.
(이것도 새로 알게된 사실!! 소 뒷걸음치다 쥐 잡은 격..)
[참고 사이트]
https://kimgom2.tistory.com/241
[Oracle] 중복 데이터 제거 DISTINCT , GROUP BY
1. DISTINCT SELECT문으로 데이터조회시 중복을 제거하고 싶을 때 DISTINCT를 사용한다. DISTINCT는 SELECT절에 열 이름을 명시하기 전에 선택적으로 사용할 수 있다. SELECT DISTINCT JOB, DEPTNO FROM EMP; DISTINCT 사
kimgom2.tistory.com
'데이터분석 과정 > SQL' 카테고리의 다른 글
SQL | REPLACE / SUBSTR / SUBSTRING_INDEX / CONCAT 함수 정리 + 실습 문제 (1) | 2024.01.07 |
---|---|
SQL | 윈도우 함수(Window Function) 사용법 정리 | RANK함수, SUM함수 (1) | 2024.01.07 |
SQL | Group By절과 집계 함수는 한 세트 | 집계 함수 사용 시 주의 사항 (1) | 2024.01.05 |
SQL | SUM함수, COUNT함수 사용법 정리 (1) | 2024.01.05 |
SQL 1주차 강의 노트정리 [국비지원_스파르타 코딩클럽] (0) | 2024.01.03 |
댓글