📝

5. 집계쿼리

 
집계 쿼리는 데이터베이스에서 데이터를 요약하고 통계를 계산하는 데 사용되는 중요한 도구입니다. 이 챕터에서는 Google BigQuery에서 집계 쿼리를 수행하는 방법과 주요 집계 함수에 대해 살펴보겠습니다. 집계 함수는 데이터의 그룹화 및 요약에 사용되며, 데이터 분석 작업에서 매우 유용합니다.

5.1. LIMIT, DISTINCT

5.1.1. LIMIT

LIMIT은 조회하는 결과의 행 수를 제한합니다. 모든 데이터를 한 번에 불러온다면 로딩 속도가 저하될 수 있으므로, 이를 방지하거나 샘플 데이터를 검색할 때 유용하게 사용됩니다.
SELECT column1 FROM Table1 LIMIT limiting number
 
예시
“employees” 테이블에서 직원들의 “employee_id”와 “first_name”, “last_name”을 10개만 조회합니다.
SELECT employee_id , first_name , last_name FROM `HR.employees` LIMIT 10;
notion imagenotion image
 

5.1.2. DISTINCT

DISTINCT중복 값을 가지는 행을 제외하고 고윳값을 가진 행만을 반환합니다. 고윳값을 찾거나 중복 데이터를 처리할 때 유용하게 사용됩니다.
SELECT DISTINCT column1 FROM Table1
 
예시 1
“employees” 테이블에서 직원들의 고유한 “job_id”를 조회합니다.
SELECT DISTINCT job_id FROM `HR.employees`;
notion imagenotion image
 
예시 2
DISTINCT 뒤에 여러 항목이 오는 경우입니다. “employees” 테이블에서 직원들의 고유한 “job_id”와 “department_id”를 조회한 결과는 다음과 같습니다.
SELECT DISTINCT job_id,department_id FROM `HR.employees`;
notion imagenotion image
DISTINCT 뒤에 여러 항목이 오는 경우 “job_id”와 “department_id” 컬럼 각각의 고윳값이 오는 것이 아닌 행의 모든 value 값이 동일한 경우에만 중복 제거가 됩니다.
예를 들어, DISTINCT“job_id”와 “department_id”를 조회하였을 때, 오른쪽 이미지의 2행과 3행을 보면 “job_id” 컬럼에서는 “AD_VP”로 값이 동일하며 “department_id” 컬럼에서도 90이라는 각각 동일한 값을 같습니다. 이러한 경우에는 중복되는 조합 중 하나의 조합만 출력됩니다.
notion imagenotion image
 
하지만 오른쪽 이미지를 보면 “job_id” 컬럼은 “SA_REP”로 동일 값이지만 “department_id” 컬럼에서는 80과 “null”이라는 다른 값을 보입니다. 이러한 경우에는 78행 조합과 79행 조합은 중복제거되지 않고 모두 출력됩니다.
notion imagenotion image
💡
DISTINCT는 특정 컬럼에만 적용할 수 없으며 뒤에 오는 모든 컬럼에 적용됩니다. 여러 컬럼이 모두 결합한 결과에서 조합이 동일한 경우에 한해서 중복제거한 결과가 반환됨을 의미합니다.
 

5.2. 집계함수

5.2.1. AVG

AVG() 함수는 해당 항목 레코드의 평균을 반환하는 함수입니다.
SELECT AVG(column1) FROM Table1
 
예시
“employees” 테이블에서 전체 근로자의 평균 임금을 소수점 2번째 자리에서 반올림하여 조회합니다.
SELECT ROUND(AVG(salary), 2) AS average_salary FROM `HR.employees`;
notion imagenotion image
 

5.2.2. SUM

SUM() 함수는 해당 항목 레코드의 합계를 반환하는 함수입니다.
SELECT SUM(column1) FROM Table1
 
예시
“employees” 테이블에서 전체 근로자의 임금 총합을 조회합니다.
SELECT SUM(salary) as total_salary FROM `HR.employees`;
notion imagenotion image
추가로, Google BigQuery에서는 명시적인 “곱셈” 함수를 제공하지 않습니다. 그래서 수치형 함수인 EXP()LOG() 함수 그리고 SUM() 함수를 사용하여 곱셈을 수행할 수 있습니다.
➡️
LOG의 성질을 활용하여 곱셈을 수행할 수 있습니다.
 
예시
앞으로 다루게 될 GROUP BY를 사용하여 “employees” 테이블에서 “job_id”별 임금 곱셈 집계를 조회합니다.
SELECT job_id , EXP(SUM(LOG(salary))) AS multiplied_salary FROM `HR.employees` GROUP BY job_id;
notion imagenotion image
 

5.2.3. COUNT

COUNT() 함수는 해당 항목 레코드의 개수를 반환하는 함수입니다. COUNT() 함수는 기본적으로 NULL 값을 제외한 레코드의 개수를 반환하고 COUNT(*) 함수는 NULL 값을 포함하여 레코드의 개수를 반환합니다.
SELECT COUNT(column1) FROM Table1
 
예시
“employees” 테이블에서 전체 근로자의 수를 조회합니다. COUNT(*)를 사용하면 NULL 값을 포함하여 조회합니다.
SELECT COUNT(manager_id) AS null_x , COUNT(*) AS null_o FROM `HR.employees`;
notion imagenotion image
 

5.2.4. MAX/ MIN

  • MAX
MAX() 함수는 해당 항목 레코드의 최댓값을 반환하는 함수입니다.
SELECT MAX(column1) FROM Table1
 
예시
“employees” 테이블에서 최대 임금액을 조회합니다.
SELECT MAX(salary) as max_salary FROM `HR.employees`;
notion imagenotion image
 
  • MIN
MIN() 함수는 해당 항목 레코드의 최솟값을 반환하는 함수입니다.
SELECT MIN(column1) FROM Table1
 
예시
“employees” 테이블에서 최소 임금액을 조회합니다.
SELECT MIN(salary) AS min_salary FROM `HR.employees`;
notion imagenotion image
 

5.2.5. VARIANCE/ STDDEV

  • VARIANCE
VARIANCE() 함수는 해당 항목 레코드의 분산을 반환하는 함수입니다.
SELECT VARIANCE(column1) FROM Table1
 
예시
“employees” 테이블에서 임금의 분산을 소수점 2번째 자리에서 반올림하여 조회합니다.
SELECT ROUND(VARIANCE(salary), 2) AS var_salary FROM `HR.employees`;
notion imagenotion image
 
  • STDDEV
STDDEV() 함수는 해당 항목 레코드의 표준편차를 반환하는 함수입니다.
SELECT STDDEV(column1) FROM Table1
 
예시
“employees” 테이블에서 임금의 표준편차를 소수점 2번째 자리에서 반올림하여 조회합니다.
SELECT ROUND(STDDEV(salary), 2) AS std_salary FROM `HR.employees`;
notion imagenotion image
 

5.3. GROUP BY

5.3.1 GROUP BY

GROUP BY 특정 컬럼을 기준으로 결과를 묶어 그룹화합니다. 그룹화된 데이터에 대해 집계함수를 적용하여 각 그룹의 특성을 요약하거나 계산할 수 있습니다. 결과로는 그룹화에 사용된 컬럼과 집계함수의 결과를 포함한 새로운 결과 집합이 생성됩니다. 일반적으로 GROUP BYWHERE문 아래에 위치하며 그룹화하려는 컬럼은 SELECT문에 들어가야 합니다.
SELECT column1 , column2 , ... FROM Table1 GROUP BY grouping column1, column2, ...;
 
GROUP BY를 사용하면 같은 값을 가진 행을 하나의 그룹으로 묶어주고 각 그룹에 해당하는 값을 집계함수인 SUM으로 계산하여 결과를 조회합니다.
 
notion imagenotion image
 
주의사항
1) SELECT문에 그룹화하려는 컬럼이 들어가야 합니다.
2) SELECT문에서 GROUP BY로 정의하지 않은 컬럼을 사용하려면 반드시 집계함수 처리를 하여야 합니다. 즉, SELECT 절에서 집계함수를 제외한 컬럼은 GROUP BY에 기술합니다.
 
  • ALIAS 관련 규칙
구버전의 경우 SELECT에서 정의한 ALIAS을 GROUP BY에서 사용할 수 없었습니다. 이는 쿼리의 처리 순서 때문에 발생하는 동작 오류로, GROUP BY 이후에 SELECT이 실행되기 때문입니다. 그러나 2023년에 도입된 새로운 기능으로 인해 GROUP BY에서도 ALIAS을 사용하는 것이 가능해졌습니다.
SELECT column1 AS COL1 , SUM(column2) FROM Table1 GROUP BY COL1
 
  • DISTINCT 와 GROUP BY 차이
DISTINCTGROUP BY는 “중복제거”라는 비슷한 기능을 하지만 DISTINCT는 “그룹핑” 작업만 수행하는 반면, GROUP BY는 “그룹핑” + “정렬” 작업까지 수행한다는 차이점이 있습니다. 따라서 사용자가 원하는 반환 결과에 따라 선택적으로 사용될 수 있습니다. DISTINCT는 정렬 작업을 하지 않기 때문에 GROUP BY에 비해 성능이 빠르고, 대신 GROUP BY는 그룹핑해서 집계함수를 이용할 때 유용합니다.
 
예시 1
“employees” 테이블에서 임금이 1억 이상인 직원들의 “job_id”별 직원 수를 조회합니다.
SELECT job_id , COUNT(employee_id) AS count_employees FROM `HR.employees` WHERE salary >= 10000 GROUP BY job_id;
notion imagenotion image
 
예시 2
GROUP BY를 활용하여 여러 항목을 그룹화하는 예시입니다. “employees” 테이블에서 임금이 1억 이상인 직원들의 “job_id”, “department_id”별 직원 수와 평균 임금을 조회합니다.
SELECT job_id , department_id , COUNT(employee_id) AS count_employees , AVG(salary) AS avg_salary FROM `HR.employees` WHERE salary >= 10000 GROUP BY job_id, department_id;
notion imagenotion image
 
예시 3
SELECT에서 정의한 별칭(ALIAS)을 GROUP BY에 사용하는 예시입니다. “employees” 테이블에서 “job_id”별 최저 임금을 조회합니다.
SELECT job_id AS j , MIN(salary) AS avg_salary FROM `HR.employees` GROUP BY j;
notion imagenotion image
 

5.4. HAVING, ORDER BY

5.4.1. HAVING

HAVING 그룹화된 결과에 특정 조건을 부여하는 기능입니다. 그룹화된 결과에서 조건을 만족하는 그룹만 추출되도록 만드는 필터로 이해할 수 있습니다. 일반적으로 GROUP BY와 같이 사용되며 GROUP BY 뒤에 위치합니다.
SELECT column1 , column2 , ... FROM Table1 GROUP BY grouping column1, column2, ... HAVING Conditions
또한 표준 SQL과 달리, MySQL에서만 예외적으로 HAVING절에 SELECT에서 정의한 ALIAS(별칭)를 사용하는 것이 허용됩니다. MySQL은 HAVING 전에 SELECT를 부분적으로 평가하기 때문에 SELECT절에서 정의한 ALIAS를 HAVING에서 사용하는 것이 가능합니다.
SELECT column1 AS COL1 , SUM(column2) AS sum_column2 FROM Table1 GROUP BY COL1 HAVING sum_column2 > 10;
 
  • WHERE와 HAVING 차이
WHEREHAVING은 데이터베이스 쿼리에서 조건을 설정하는 데 사용되지만, 그들 간에 중요한 차이가 있습니다. WHERE는 데이터 필터링과 행 선택에 사용되며, 데이터를 집계하기 전에 조건을 적용합니다. 이로써 불필요한 데이터를 제거하여 연산량을 줄일 수 있습니다. 반면, HAVING은 집계 함수를 사용하여 데이터를 그룹화한 후에 조건을 설정하며, 집계 후에 조건을 적용합니다. 이에 따라 HAVING은 집계된 데이터 집합에 대한 조건을 검사하므로 연산량이 더 많을 수 있습니다. 따라서 데이터 필터링 및 행 선택을 위해 WHERE을 사용하고, 그룹화된 데이터에 대한 조건을 설정할 때 HAVING을 사용하여 쿼리의 성능을 최적화할 수 있습니다.
 
예시
다음 예시는 “employees” 테이블에서 연봉이 1억 이상인 직원들의 “job_id”별 직원 수가 3명 이상인 결과를 조회합니다.
SELECT job_id , COUNT(employee_id) AS count_employees FROM `HR.employees` WHERE salary >= 10000 GROUP BY job_id HAVING count_employees >= 3;
notion imagenotion image
 

5.4.2. ORDER BY

ORDER BY는 결과를 정렬합니다. 오름차순(ASC)과 내림차순(DESC) 정렬이 있고 기본값인 오름차순(ASC)은 생략 가능합니다.
SELECT column1 , column2 , ... FROM Table1 ORDER BY column1 ASC, column2 DESC ...
  • ALIAS 관련 규칙
    • SQL 쿼리에서 ALIAS(별칭)를 사용하는 규칙은 다음과 같습니다
    • WHERE: SELECT에서 정의한 ALIAS를 사용할 수 없습니다.
    • GROUP BY: SELECT에서 정의한 ALIAS를 사용할 수 있습니다. 이 기능은 2023년에 도입된 것으로, GROUP BY에서도 ALIAS를 사용하는 것이 가능해졌습니다.
    • HAVING: SELECT에서 정의한 ALIAS를 사용할 수 있습니다.
    • ORDER BY: SELECT에서 정의한 ALIAS를 사용할 수 있습니다.
 
  • 실행순서
    • SQL에서 성능 최적화를 위해 동작하는 순서를 살펴보면 다음과 같습니다.
      1. FROM
      1. WHERE
      1. GROUP BY
      1. HAVING
      1. SELECT
      1. DISTINCT
      1. ORDER BY
      1. LIMIT
💡
코드 작성 시 다음과 같은 순서를 유의하여 작성한다면 동작순서 오류로 인한 에러를 방지할 수 있습니다. 추가로, ORDER BY 단계에서 정렬 연산이 수행될 때 성능 저하가 발생할 수 있으므로 사용 시 유의해야 합니다.
 
예시 1
“employees” 테이블에서 “job_id”별 직원 수를 조회합니다. “job_id”별 직원 수는 내림차순으로 정렬하고 이를 상위 5개만 조회합니다.
SELECT job_id , COUNT(employee_id) AS count_employees FROM `HR.employees` GROUP BY job_id ORDER BY count_employees DESC LIMIT 5;
notion imagenotion image
 
예시 2
“employees” 테이블에서 임금이 1억 미만인 직원 중 “job_id”, “department_id”별 직원 수를 조회합니다. 직업별, 부서ID별 직원 수가 5명 이상만 조회하며, 이를 내림차순으로 정렬합니다.
SELECT job_id , department_id , COUNT(employee_id) AS count_employees FROM `HR.employees` WHERE salary < 10000 GROUP BY job_id, department_id HAVING count_employees >= 5 ORDER BY count_employees DESC;
notion imagenotion image
 
예시 3
다음은 ORDER BY의 다중 정렬 예시입니다. ORDER BY 다중 정렬을 할 때는 적는 컬럼의 순서를 고려해야 합니다. 왼쪽부터 순차적으로 정렬되기 때문에 우선순위가 높은 컬럼 순으로 나열하는 것이 좋습니다. 이전 예시에서 “department_id”별 직원 수는 내림차순 정렬, “department_id”는 오름차순으로 정렬하여 조회합니다.
SELECT job_id , department_id , COUNT(employee_id) AS count_employees FROM `HR.employees` WHERE salary < 10000 GROUP BY job_id, department_id HAVING count_employees >= 5 ORDER BY count_employees DESC, department_id ASC;
notion imagenotion image
 

5.5. ROLLUP

ROLLUP그룹화된 결과를 계층적으로 집계합니다. 그룹화된 결과에 소계, 총계(부분합, 총합) 등의 다양한 계층적 집계가 “null”로 표시되어 추가됩니다. GROUP BY와 함께 사용되며 GROUP BY 바로 뒤에 위치합니다.
notion imagenotion image
 

5.5.1. GROUP BY 컬럼이 1개인 경우

ROLLUPGROUP BY 컬럼이 1개인 경우와 2개 이상인 경우가 있는데, 먼저 GROUP BY 컬럼이 1개인 경우입니다. 이 경우에는 그룹핑된 컬럼의 총계가 결과에 추가되어 반환됩니다.
GROUP BY ROLLUP(column1)
 
예시 1
“employees” 테이블에서 “job_id”별 임금의 합계를 상위 10개로 제한하여 조회합니다.
SELECT job_id , SUM(salary) AS sal_sum FROM `HR.employees` GROUP BY ROLLUP(job_id) LIMIT 10;
notion imagenotion image
 
예시 2
“employees” 테이블에서 “job_id”별 임금의 합계, 평균, 최솟값 그리고 최댓값을 조회합니다. “job_id”별 연봉의 합계, 평균, 최솟값, 최댓값은 각각 내림차순, 내림차순, 오름차순, 내림차순 순으로 상위 10개로 제한하여 조회합니다.
SELECT job_id , SUM(salary) AS sal_sum , AVG(salary) AS sal_avg , MIN(salary) AS sal_min , MAX(salary) AS sal_max FROM `HR.employees` GROUP BY ROLLUP(job_id) ORDER BY sal_sum DESC, sal_avg DESC, sal_min ASC, sal_max DESC LIMIT 10;
notion imagenotion image
💡
ROLLUPGROUP BY로 그룹핑된 결과를 바탕으로 집계하기 때문에 GROUP BY로 그룹화하지 않은 컬럼을 SELECT 문에 포함시킨다면 다음과 같은 에러가 발생합니다.
notion imagenotion image
 

5.5.2. GROUP BY 컬럼이 2개 이상인 경우

다음으로 GROUP BY컬럼이 2개 이상인 경우입니다. 이 경우에는 ROLLUP의 인자로 들어온 컬럼들에서 왼쪽부터 그룹을 만들고, 그룹별 소계와 총계가 결과에 각각 추가되어 반환됩니다.
GROUP BY ROLLUP(column1, column2 ..)
➡️
예를 들어, GROUP BY ROLLUP(A, B, C)의 동작 원리는 다음과 같습니다.
  • ROLLUP의 인자로 들어온 컬럼들 중 왼쪽부터 그룹을 만듭니다.
  • '()'는 전체에 대한 집계 결과를 의미합니다.
  • A : A 그룹에 대한 집계 결과를 의미합니다.
  • A, B : A+B 조합에 대한 집계 결과를 의미합니다.
  • A, B, C : A+B+C 조합에 대한 집계 결과를 의미합니다.
  1. ()
  1. A
  1. A, B
  1. A, B, C
 
notion imagenotion image
💡
MySQL과 BigQuery의 ROLLUP에는 차이점이 있습니다. BigQuery는 전체에 대한 집계 결과가 상단에 위치하며 왼쪽부터 그룹을 만들며 집계하는 반면, MySQL은 오른쪽에서부터 그룹을 만들며 집계하기 때문에 전체에 대한 집계 결과가 하단에 위치합니다.
 
예시
“employees” 테이블에서 “job_id”, “department_id”, “manager_id”별 임금 합계를 상위 11개로 제한하여 조회합니다.
SELECT job_id , department_id , manager_id , SUM(salary) AS sal_sum FROM `HR.employees` GROUP BY ROLLUP(job_id, department_id, manager_id) LIMIT 11;
notion imagenotion image
 
  • 결합 컬럼을 사용한 ROLLUP
ROLLUP에서 여러 개의 컬럼을 괄호로 묶는다면 하나의 컬럼으로 볼 수 있습니다.
GROUP BY ROLLUP(column1, (column2, column3 ..))
➡️
예를 들어, GROUP BY ROLLUP(A, (B, C))의 동작 원리는 다음과 같습니다.
  • ROLLUP의 인자로 들어온 컬럼들 중 왼쪽부터 그룹을 만듭니다.
  • '()'는 전체에 대한 집계 결과를 의미합니다.
  • 괄호로 묶여있는 컬럼은 하나의 집합으로 봅니다.
  • A : A 그룹에 대한 집계 결과를 의미합니다.
  • A, (B, C) : A+(B&C) 조합에 대한 집계 결과를 의미합니다.
  1. ()
  1. A
  1. A, (B, C)
notion imagenotion image
 
예시
“employees” 테이블에서 “department_id”, “manager_id”는 하나의 집합으로 간주하여 “job_id”, “department_id” & “manager_id”별 임금 합계를 상위 10개로 제한하여 조회합니다.
SELECT job_id , department_id , manager_id , SUM(salary) AS sal_sum FROM `HR.employees` GROUP BY ROLLUP(job_id, (department_id, manager_id)) LIMIT 10;
notion imagenotion image
💡
추가로 ROLLUP은 전체 컬럼을 감싸는 대신 부분적으로 어떤 컬럼을 감쌀지, 감싸지 않을지 선택할 수 있습니다. 하지만 Google BigQuery에서는 이러한 부분 ROLLUP을 지원하지 않습니다.
 
  • 소계 없이 총계만 조회하는 방법
이중 괄호를 사용하면 소계 없이 총계만 조회가 가능합니다.
GROUP BY ROLLUP((column1, column2 ,column3..))
 
예시
“employees” 테이블에서 “job_id”, “department_id”, “manager_id”별 임금 합계를 총계만 조회하고 상위 10개로 제한합니다.
SELECT job_id , department_id , manager_id , SUM(salary) AS sal_sum FROM `HR.employees` GROUP BY ROLLUP((job_id, department_id, manager_id)) LIMIT 10;
notion imagenotion image
 

5.5.3. ROLLUP외 그룹함수

SQL에서 그룹함수로 ROLLUP 외에 CUBE, GROUPING SETS 가 있습니다. ROLLUP은 기술된 인자의 순서에 의해 집계하므로 작성되는 순서가 중요하고, CUBE는 인자 간 가능한 모든 조합에 대해 집계합니다. GROUPING SETS는 선택적 소계나 합계를 구하고자 할 때 사용됩니다.
그리고 GROUPING은 소계나 합계로 표시되는 “null”을 새로운 용어로 표현하고자 할 때 사용됩니다. 소계나 합계로 표시된 “null”과 원래 데이터의 NULL 값을 구분하는 데 사용되며 인자는 하나밖에 쓸 수 없습니다.
💡
Google BigQuery에서 GROUPING_ID 구문은 지원하지 않습니다.
 
  • CUBE
CUBE결합할 수 있는 모든 조합에 대해 집계합니다. 모든 경우에 대해서 집계하므로 ROLLUP에 비해 연산 대상이 많아 사용에 주의해야 합니다. ROLLUP과 달리, 인자 간 순서가 바뀌어도 같은 결과를 반환합니다.
GROUP BY CUBE(column1, column2 ,column3..)
➡️
예를 들어, GROUP BY CUBE(A, B, C)의 동작 원리는 다음과 같습니다.
  1. ()
  1. A
  1. B
  1. C
  1. A, B
  1. A, C
  1. B, C
  1. A, B, C
notion imagenotion image
 
예시
“employees” 테이블에서 “department_id”, “job_id”의 가능한 모든 조합에 대해 평균 임금을 상위 9개만 조회합니다.
SELECT department_id , job_id , AVG(salary) AS avg_sal FROM `HR.employees` GROUP BY CUBE(department_id, job_id) LIMIT 9;
notion imagenotion image
 
  • GROUPING SETS
GROUPING SETS는 선택적으로 다양한 소계 집합을 만듭니다. GROUP BY한 것들을 UNION ALL한 결과와 같습니다. 인자로 ROLLUPCUBE를 포함할 수 있고, ROLLUP과 달리 인자 간 순서가 바뀌어도 같은 결과를 반환합니다. 만약 선택적 소계 결과에 총계까지 표현하고 싶을 때는 GROUPING SETS 인자로 ()을 추가로 넣어줍니다.
GROUP BY GROUPING SETS(column1, column2 ,column3..)
 
예시
“employees” 테이블에서 “department_id”, “job_id”, “department_id” & “job_id”별 평균 임금을 상위 12개만 조회합니다. 해당 결과에 총계까지 추가하면 다음과 같습니다.
SELECT department_id , job_id , AVG(salary) AS average_salary FROM `HR.employees` GROUP BY GROUPING SETS((), department_id, job_id, (department_id, job_id)) LIMIT 12;
notion imagenotion image
notion imagenotion image
 
“department_id”가 90에 해당되는 경우로 위의 결과를 살펴보겠습니다.
1행은 “()” 인자에 따른 결과로 전체 임금의 평균, 즉 총계를 나타냅니다. 전체 임금을 확인해보면 같은 결과를 보임을 확인할 수 있습니다.
SELECT AVG(salary) AS avg_sal FROM `HR.employees`;
notion imagenotion image
 
2행(파란색)은 “department_id”별 평균 임금입니다. 아래 쿼리를 통해 “department_id”의 소계가 맞는지 확인할 수 있습니다.
SELECT department_id , AVG(salary) avg_sal FROM HR.employees GROUP BY department_id;
notion imagenotion image
 
3행과 5행(녹색)은 각 “job_id”별 평균 임금입니다. 마찬가지로 아래 쿼리를 통해 “job_id”의 소계가 맞는지 확인할 수 있습니다.
SELECT job_id , AVG(salary) avg_sal FROM HR.employees GROUP BY job_id;
notion imagenotion image
4행과 6행(노랑색)은 각 “department_id” & “job_id”별 평균 임금입니다. 아래 쿼리를 통해 “department_id” & “job_id”의 소계가 맞는지 확인할 수 있습니다.
SELECT department_id , job_id , AVG(salary) avg_sal FROM HR.employees GROUP BY department_id, job_id;
notion imagenotion image