SQL에는 여러가지 집계함수가 있다. 집계함수는 그룹별로 값을 집계해준다. 이를 이용하면 회사 부서별로 평균 임금을 구해볼 수도있고, 학교 반별로 최소 성적을 구해볼수도 있다.
그룹별로 집계를 하기 위해서는 쿼리를 아래와 같이 작성한다. group_name에서는 그룹화를 원하는 테이블의 필드가 들어간다. 그리고 value에는 집계를 원하는 값을 넣어주면 된다. 예시에는 그룹별 합(SUM)을 예시로 들었지만, SUM 대신 MIN이나 MAX, AVG 등도 사용할 수 있다.
SELECT group_name, SUM(value)
FROM table
GROUP BY group_name;
일반적으로는 위의 형태를 사용하지만, 집계함수는 GROUP BY문 없이도 사용할 수 있다. 그룹없이 어떻게 집계를 하냐고 할수도 있지만, 그룹화없이 집계를한다면 집계의 대상은 전체 테이블이 된다. GROUP BY 없이 집계함수를 사용하면 전체 테이블을 기준으로 합계, 최댓값, 최솟값, 그리고 평균을 구하게 된다.
더 깊은 이해를 위해 하나의 예시를 들어보자. 아래의 문제도 그룹화 없이 집계하는 문제이다.
https://www.hackerrank.com/challenges/weather-observation-station-13/problem?isFullScreen=true
Weather Observation Station 13 | HackerRank
Query the sum of Northern Latitudes having values greater than 38.7880 and less than 137.2345, truncated to 4 decimal places.
www.hackerrank.com
Query the sum of Northern Latitudes (LAT_N) from STATION having values greater than 38.7880 and less than 137.2345. Truncate your answer to decimal places.
문제에서는 38.7880보다 크고, 137.2345보다 작은 위도(LAT_N)를 추려 낸뒤에, 추려낸 위도의 총합을 구하길 원한다.
쿼리는 아래와 같이 간단히 작성할 수 있지만, 아래 쿼리는 정확하게 이해하는것이 중요하다. 두가지 정도를 짚고 넘어가면 좋겠다.
SELECT TRUNCATE(SUM(lat_n), 4)
FROM station
WHERE lat_n > 38.7880 AND lat_n < 137.2345;
1) 위의 쿼리에서는 집계함수 SUM을 사용하지만, GROUP BY가 없다. 즉, 전체 테이블을 기준으로 집계를 하는 것이다.
2) 쿼리의 실행 순서는 FROM > WHERE > SELECT 이다. 그래서, 먼저 테이블에서 조건에 맞는 행들을 먼저 걸러낸다. 그리고 그 후에 필터링된 행들로 집계(SUM)을 진행한다.
이렇게 집계함수 뿐만아니라, 쿼리의 실행순서에 대해 알고 문제를 풀어야 정확하게 문제를 풀었다고 할 수 있겠다.
'sql' 카테고리의 다른 글
[sql] 월 전체 매출액 대비 비율 (0) | 2023.12.29 |
---|---|
[sql] date_trunc (0) | 2023.12.28 |
[SQL][HackerRank] The Blunder (0) | 2023.01.03 |
[SQL][HackerRank] Binary Tree Nodes (0) | 2023.01.02 |
[SQL][HackerRank] Occupations (0) | 2022.12.27 |