이제 본격적으로 통계 영역으로 한걸음 나아갈 때입니다. 데이터베이스로 데이터를 관리하는 여러 이유 중에, 저는 수많은 데이터를 엮어 의미 있는 지표를 만들어 내고, 또 그것을 시계열로 차트를 그려내어 데이터의 흐름을 판단하기 위한 것을 가장 중요하게 생각합니다. 그러기 위해서는 관점별로 수치 지표에 대한 roll-up 을 다룰 줄 알아야 합니다. 

 

  예를 들면서 roll-up에 대한 설명을 드리겠습니다. 아래 city 테이블에는 도시별로 인구수가 있습니다.

 

country 테이블에는 국가코드와 국가명이 있다고 했을 때 한국의 총인구수는 얼마나 되는 지 구해보겠습니다.

 

 

먼저 한국의 도시별 인구를 구합니다. 이게 되면 한국전체 인구를 구합니다.

 

 

한국 전체 인구수를 구하는 SQL입니다. 한국 기준이 때문에 우선 city 테이블의 컬럼은 select 항목에서 빠져야 합니다.

a.Code와 a.Name 은 국가코드와 국가명입니다. a가 가르키는 것이 country 테이블이죠. 그다음에 sum() 이라는 함수를 사용했습니다. 엑셀처럼 합계를 하는 함수입니다. 인자는 city 테이블의 Population 컬럼입니다. 따라서 국가코드, 국가명 명 기준으로 인구수를 합계해라라는 명령이 됩니다. 그런데 이 sum() 함수는 아래 group by 와 같이 써 줘야 합니다.  대부분은 select 에 컬럼과 동일하게 적어주면 됩니다. 결과를 보면, 3천9백만 명으로 나옵니다. 그냥 예제 데이 터니까 그러려니 하시길 바랍니다.

 

자, 그런데 사실은 country 테이블에도 Population 컬럼이 있습니다. 한번 확인해볼까요?

country 테이블의 Popluation 컬럼은 max() 함수로 구했습니다. max값은 데이터 중에 최댓값을 구한다는 뜻인데요, 만약에 그냥 sum()을 사용하면 인구수가 4천7백만 명 x 도시수만큼 나오게 됩니다. 

 

 

왜 sum(a.Population) 을 쓰면 안 되는지 설명드리겠습니다. 물론 문법적으로는 문제가 없습니다. 데이터 값이 틀리게 되는 거죠. sum과 group by 부분을 빼고 실행하면 아래와 같이 결과가 나옵니다. country 테이블의 population 은 같은 데이터가 연속으로 나열된 것이 보이죠? sum()을 하게 되면 이 중복으로 나온 값을 다 합산을 하기 때문에 sum()을 쓰면 안 된다는 이야기입니다. max()는 이 중에서 가장 큰 값을 구하는데, 모두 동일한 값이 기 때문에 어떤 값이 나와와도 괜찮겠죠?

국가 전체 인구와 같은 경우 max()를 하지 않고 어떤 경우에는 관점으로 정의할 수 도 있습니다. select 항목 중에 alias 는group by에서는 빼줘야 합니다. 즉 as ~ 는 쓰지 않습니다. 

 

자주 사용하는 통계 합수를 간단히 정리해드리겠습니다.

 

  • sum() : 합계
  • max() : 최대값
  • min() : 최소값
  • avg() : 평균값
  • count() : 건수
  • std(), stddev(), stddev_pop() : 표준편차. stddev() 가 오라클에도 사용되기 때문에 가장 많이 쓰입니다.
  • var_pop(), variance() : 분산. 오라클에서는 variance()를 씁니다.

 

수고하셨습니다.

 

 

 

 

 

 

 

 

+ Recent posts