[SQL] data.world tutorial SQL Aggregatio 예제 풀이
역시 데이터는 row 도 중요하지만 집계도 중요하다.
이 글은 data.world 의 Aggregation 튜토리얼 예시에 대한 풀이이다. [링크]
Aggregations
Learn about aggregations, aggregation function and aggregation modifiers in this SQL tutorial. Visit for a full course on learning the basics of SQL.
docs.data.world
Aggregation 에 대한 1줄 정리
An aggregation is the result returned from running an aggregate function in a query and is displayed in a new column in the results table. An aggregate function is a function that results of a set of the data queried being condensed into an aggregation.
집계는 aggregate function 을 사용한 쿼리를 수행하여 결과를 리턴하며, 결과 셋에 새로운 컬럼으로 표시된다. Aggregate function 은 집계로 요약된 데이터셋을 제공하는 함수이다.
COUNT, SUM, AVG, MIN, MAX 대표적인 함수에 대한 예제이다.
1. 요구사항을 검토한다.
예제에서 우리가 관심있는 값은 거래의 value 이다.
sales_pipeline 테이블에서는 close_value 필드에 저장된다.
또 살펴보아야하는 필드가 deal_stage 이다. 거래 단계에 따라 close_value 의 값이 다른 형태로 저장되기 때문이다!
Requirement | Aggregation Function | Deal Stage |
the total value of all the deals closed* | SUM | ? --> Won, Lost |
the number of deals we had won | COUNT | Won |
the average deal won | AVG | Won |
the largest deal | MAX | All (Won, Lost, In Progress) |
the smallest deal | MIN | All (Won, Lost, In Progress) |
*사실 closed 가 모호하니까, 요구사항 낸 사람에게 물어봐서 답을 얻었다. Won, Lost 로
2. Dataset 을 확인한다.
쿼리하기에 앞서 deal_stage 에 따라 close_vlaue 가 어떻게 쌓이는지 확인한다.
3. 집계 추출
3-a. the total value of all the deals closed
SELECT SUM(close_value) FROM sales_pipeline WHERE sales_pipeline.deal_stage IN ("Won", "Lost") |
closed 에 대해서 피드백을 주고받은 후 거래상태를 명시하였다.
쿼리 결과에 따르면 closed_date 가 있는 것 / closed_value 가 numeric value 로 저장된 거래가 closed 임을 알 수 있다.
(즉 closed 는 거래단계 Won, Lost 을 포괄한다.)
3-b. the number of deals we had won
SELECT COUNT(close_value) FROM sales_pipeline WHERE deal_stage = "Won" |
주의 COUNT(*) 와 COUNT(컬럼명) 은 결과값이 다를 수 있다.
- COUNT (*): FROM, WHERE 을 통해 가져온 데이터의 모든 행의 수
- COUNT (close_value): FROM, WHERE 을 통해 가져온 데이터의 close_value NOT NULL 값의 수
In Progress 의 거래는 2089 개가 있지만, close_value 값이 null 이므로 COUNT(close_value) 를 실행시킬 때 집계 대상이 아니다.
물론 진행중인 거래는 close_value 가 없으므로, 이런 요구사항이 들어오지 않겠지만.
3-c. the average deal won
SELECT AVG(close_value) FROM sales_pipeline WHERE deal_stage = "Won" |
3-d. the largest deal
SELECT MAX(close_value) FROM sales_pipeline |
3-e. the smallest deal
SELECT MIN(close_value) FROM sales_pipeline -- 0 SELECT MIN(close_value) FROM sales_pipeline WHERE deal_stage = "Won" -- 38 |
주의. 사실 요구사항에서 거래상태에 대해 명시해 주지 않았기 때문에 결과는 0 이다.
하지만 요구사항을 준 사람이 의도한 바는 성사된 거래 중 가장 작은 가치의 거래일 가능성이 높다. 좋은 결과를 여러 차례 피드백을 주고 받는 것이 중요하다.
사실 전체 테이블을 대상으로 집계하기도 하지만 특정 컬럼의 값에 대하여 구분하여 집계하기도 한다. (피벗테이블의 원리)
그래서 그 다음 소개할 내용은 GROUP BY 이다.