[Oracle]집계쿼리

InHwa Hong·2021년 11월 5일
0

SQL

목록 보기
1/10
  • Group by 절과 집계함수로 구성된다.
  • 특정 항목별 최소, 최대, 평균 값 등 기본적인 데이터 분석에 사용됨
  • 집계함수 단독으로 사용 가능하나, group by 절의미있는 결과를 얻으려면 같이 사용
  • 집계함수의 결과값으로 조건을 주려면 HAVING 절을 사용한다.
  • 집계함수 없이 GROUP BY 절만 사용하면 원하는 컬럼이나 표현식의 고유한 값을 얻을 수 있는데, DISTINCT 키워드를 사용하면 GROUP BY 절 없이 동일한 결과를 얻을 수 있다.

Group by 절

  • 기본형태
SELECT expr1, expr2, ...
	FROM ...
WHERE ...
GROUP BY expr1, expr2, ...
ORDER BY ... ;
  • WHERE 절과 ORDER BY 절 사이에 위치 ★
  • GROUP BY 절에 기술한 컬럼, 표현식 이외의 항목은 SELECT 절에 명시 불가 단, 집계 함수는 가능 ★
  • GROUP BY 절과 집계 함수를 함께 사용해야 의미 있는 결과를 도출
  • Example
SELECT TO_CHAR(hire_date,'yyyy') AS HIRE_YEAR
	FROM employees 
GROUP BY TO_CHAR(hire_date,'yyyy') ;

-> 입사년도별 집계를 하므로 총 죄회 되는 로우 수는 8개
-> GROUP BY 절에는 SELECT 절에 기술한 형태 그대로 사용해야 함 (별칭은 기술하면 안됨) ★


집계 함수

  • 집계 함수는 where 절에 사용 불가★

COUNT(expr) - expr의 전체 개수 반환

  • 지정 컬럼에 NULL 값이 있을 경우 건수로 세지 않는다.
  • expr은 컬럼을 포함한 표현식, 보통 * 사용
  • 매개변수 ' * '는 COUNT 함수에서만 사용

MAX(expr) - expr의 최대값 반환

MIN ( expr ) - expr의 최솟값 반환

SUM ( expr ) - expr의 합계 반환

AVG ( expr ) - expr의 평균값 반환

VARIANCE ( expr ) - expr의 분산 반환

STDDEV ( expr ) - expr의 표준편차 반환

  • Example
SELECT COUNT(*) AS total_cnt
	, MIN(salary) as min_salary 
    , MAX(salary) as max_salary
    FROM employees ;

-> employees 테이블의 전체 로우 건 수
-> salary 컬럼의 최소와 최댓값


HAVING 절

  • 집계 쿼리에서 집계 함수 반환 값에 대한 조건을 걸 때 사용
    예) 한 반에서 과목별 평균 점수가 60점 이상인 과목을 조회
    -집계 쿼리로 평균 값 산출 : AVG(점수)
    -WHERE AVG(점수) >= 60 X
    -HAVING AVG(점수) >= 60 O

DISTINCT

  • 기본형태
SELECT DISTINCT expr1, expr2 … 
FROM
  • DISTINCT 뒤에 명시한 표현식(컬럼)의 고유한 값을 조회
  • 집계 함수 없이 GROUP BY 절을 사용한 것과 동일한 효과
  • COUNT(DISTINCT 컬럼1) -> 해당 컬럼의 고유값의 수 반환.
  • Examples
SELECT job_id 
FROM employees
GROUP BY job_id; 

SELECT DISTINCT job_id 
FROM employees;

-> 두 결과값 같음


Examples

-- employees 테이블의 jod_id별 건수, salary컬럼의 최소와 최댓값

SELECT job_id
    , COUNT(*) AS total_cnt
    , MIN(salary) AS min_salary
    , MAX(salary) AS max_salary
FROM employees
GROUP BY job_id
ORDER BY job_id ;

-- 2004년 이후 입사 년도와 부서별 총 인원수와 급여 총액, 급여 평균

select to_char(hire_date, 'yyyy') as 입사년도
    , department_id as 부서
    , count(*) as 총인원수
    , sum(salary) as 급여총액
    , round(avg(salary),0) as 급여평균 --round 함수로 소숫점 제거
from employees
where to_char(hire_date, 'yyyy') >='2004'
group by to_char(hire_date, 'yyyy'), department_id
order by 1,2;

-- 입사년도와 부서별 총 인원수, 급여 총액, 급여 평균이 5000이상인 값 조회

select to_char(hire_date, 'yyyy') as 입사년도
    , department_id as 부서
    , count(*) as 총인원수
    , sum(salary) as 급여총액
    , round(avg(salary),0) as 급여평균 --round 함수로 소숫점 제거
from employees
group by to_char(hire_date, 'yyyy'), department_id
Having round(avg(salary),0) >=5000 --집계함수 조건은 Having절 사용★
order by 1,2;

-- 보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다. 09:00부터 19:59까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요. 이때 결과는 시간대 순으로 정렬해야 합니다.

SELECT to_char(datetime, 'hh24') AS HOUR
    , count(*) AS COUNT
FROM animal_outs
WHERE to_char(datetime, 'hh24') >='09'
    AND to_char(datetime, 'hh24') <'20'
GROUP BY to_char(datetime, 'hh24')
ORDER BY 1;

0개의 댓글