데이터베이스

22일차//[Oracle] ORDER BY, GROUP BY (+ 년 월 일)

aesup 2021. 2. 9. 12:47
728x90

GROUP BY절 사용법


 

GROUP는 특정 컬럼을 기준으로 집계를 내는데 사용된다.

일단 예를 들어 보도록 하겠습니다.

아래와 같이 학급 전체의 성적을 나타내는 테이블이 있습니다.

class는 반 명이며 name 학생 이름 score는 해당 학생의 성적 점수 입니다.

 

 

 

이제 이런 학급 전체 성적을 학급 별로 총합 집계를 내고 싶으면 group by를 이용합니다.

 

SELECT CLASS, SUM(SCORE) 

FROM TBL_REPORT_CARD 

GROUP BY CLASS;

 

그럼 다음과 같이 학급별로 점수 총합의 결과가 출력 됩니다.

 

 

Group by를 사용 하는 방법은 아래와 같습니다.

 

 

SELECT [GROUP BY 절에 지정된 컬럼1] [GROUP BY별로 집계할 값] 

FROM [테이블 명] 

GROUP BY [ 그룹으로 묶을 컬럼 값 ]

 

 

 

Having절 사용법


 

Having 절은 Group by로 집계된 값 중 where 절 처럼 특정 조건을 추가한다고 생각 하시면 됩니다.

예를 들어 학급별 총합 결과 중에 150점 이상인 것만 출력 하고 싶으면 다음과 같이 예제를 작성하면 됩니다.

 

 

SELECT CLASS, SUM(SCORE) 

FROM TBL_REPORT_CARD 

GROUP BY CLASS

HAVING SUM(SCORE) > 150 ;

 

결과 값은 아래와 같습니다.

 

Having 절을 사용 하는 방법은 아래와 같습니다.

 

SELECT [GROUP BY 절에 지정된 컬럼1] [GROUP BY별로 집계할 값] 

FROM [테이블 명] 

GROUP BY [ 그룹으로 묶을 컬럼 값 ]

HAVING [조건 추가] ;




/*
ORDER BY == SORTING

SELECT COLUM VALUE SUB QUERY
FROM TABLE SUB QUERY
WHERE IF
ORDER BY COLUMN ASC DESC
*/

DESC EMP;

SELECT ename,sal
FROM emp
ORDER BY sal ASC;--오름차순


SELECT ename,sal
FROM emp
ORDER BY sal DESC;

--alias
SELECT empno, ename, sal*12 AS annsal

FROM emp
ORDER BY annsal DESC;

--보너스 없는 사람 순으로
SELECT ename, comm
FROM emp
ORDER BY comm NULLS FIRST;

SELECT employee_id,job_id, salary
FROM employees
ORDER BY job_id ASC, salary DESC;

--months_between : 
SELECT sysdate
FROM DUAL;

SELECT MONTHS_BETWEEN('2021-06-23', '2021-02-09')
FROM dual;


--add_months : 특정 날짜 월에 정수를 더한 다음 해당 날짜를 반환한다.
SELECT ADD_MONTHS('2021-02-09', 4)
FROM DUAL;

-- 년 월 일
SELECT EXTRACT(year from TO_DATE('210623','YYMMDD')) AS 연도,
    EXTRACT(month from TO_DATE('210623','YYMMDD')) AS 월,
        EXTRACT(day from TO_DATE('210623','YYMMDD')) AS 일
FROM DUAL;
-- 시 분 초
SELECT EXTRACT(hour from CAST(SYSDATE AS TIMESTAMP)) AS 시,
    EXTRACT(MINUTE from CAST(SYSDATE AS TIMESTAMP)) AS 분,
    EXTRACT(SECOND from CAST(SYSDATE AS TIMESTAMP)) AS 초
FROM DUAL;


SELECT EXTRACT(hour from CAST(TO_DATE('2021-06-23 09:42:02','YYYY-MM-DD HH24:MI:SS') AS TIMESTAMP)) AS 시,
    EXTRACT(MINUTE from CAST(SYSDATE AS TIMESTAMP)) AS 분,
    EXTRACT(SECOND from CAST(SYSDATE AS TIMESTAMP)) AS 초
FROM DUAL;

/*
GROUP BY : 그룹으로 묶는 기능
*/

SELECT DISTINCT job_id
FROM employees;

SELECT department_id
FROM employees
GROUP BY department_id
ORDER BY department_id ASC;

/*
통계 - GROUP FUNCTION
count 
sum
avg
max
min



*/
--
SELECT COUNT(salary), count(*), sum(salary), avg(salary), max(salary), min(salary)
FROM employees
WHERE job_id = 'IT_PROG';

SELECT job_id, count(*), sum(salary), avg(salary)  --count 업무별로 몇명이냐, 합계는 몇이냐, 평균은 몇이냐
FROM employees
GROUP BY job_id
ORDER BY job_id;


SELECT job_id, sum(SALARY)
FROM employees
GROUP BY job_id
HAVING SUM(salary) >=100000;  --having절은 그룹하고 사용

급여가 5000이상 받는 사원만으로 합계를 내서 업무(JOB_ID)로 그룹화하여
급여의 합꼐가 20000을 초과하는 업무명을 구하라

SELECT job_id, sum(salary)
FROM employees
WHERE salary >=5000
GROUP BY job_id
HAVING SUM(salary) > 20000; 

728x90