본문 바로가기
SQL

[SQL] 집약

by UnoCode 2020. 9. 2.

SQL에는 집약 함수(aggeregate function)라고 합니다.

 

COUNT

SUM

AVG

MAX

MIN

 

너무 기초이므로 다 다루지는 않겠습니다.

 

NonAggTbl 테이블 생성

id data_type data_1 data_2 data_3 data_4 data_5 data_6
Jim A 100 10 34 346 54  
Jim B 45 2 167 77 90 157
Jim C   3 687 1355 324 457
Ken A 78 5 724 357   1
Ken B 123 12 178 346 85 235
Ken C 45   23 46 687 33
Beth A 75 0 190 25 356  
Beth B 435 0 183   4 325
Beth C 96 128   0 0 12

 

데이터 타입 'A'의 레코드에 대한 쿼리

SELECT id, data_1, data_2
FROM NonAggTbl
WHERE id = 'Jim'
	AND data_type = 'A';

 

데이터 타입 'B'의 레코드에 대한 쿼리

SELECT id, data_3, data_4, data_5
FROM NonAggTbl
WHERE id = 'Jim'
	AND data_type = 'B';

 

데이터 타입 'C'의 레코드에 대한 쿼리

SELECT id, data_6
FROM NonAggTbl
WHERE id = 'Jim'
	AND data_type = 'C';

 

CASE 식과 GROUP BY응용

 

 

SELECT id,
		MAX(CASE WHEN data_type = 'A' THEN data_1 ELSE NULL END) AS data_1,
        MAX(CASE WHEN data_type = 'A' THEN data_2 ELSE NULL END) AS data_2,
        MAX(CASE WHEN data_type = 'B' THEN data_3 ELSE NULL END) AS data_3,
        MAX(CASE WHEN data_type = 'B' THEN data_4 ELSE NULL END) AS data_4,
        MAX(CASE WHEN data_type = 'B' THEN data_5 ELSE NULL END) AS data_5,
        MAX(CASE WHEN data_type = 'C' THEN data_6 ELSE NULL END) AS data_6
	FROM NonAggTbl
    GROUP BY id
    ORDER BY id DESC;

 

실행계획

 

집약에 대한 다른 문제 1

 

PriceByAge

reserve_id low_age high_age price
제품1 0 50 2000
제품1 51 100 3000
제품2 0 100 4200
제품3 0 20 500
제품3 31 70 800
제품3 71 100 1000
제품4 0 99 8900

 

제품 범위가 모든 연령 범위인것만 고르기

 

SELECT reserve_id
FROM PriceByAge
GROUP BY reserve_id
HAVING SUM(high_age-low_age + 1) = 101

 

 

집약에 대한 다른 문제 2

 

사람들이 숙박한 날이 10일 이상인 방 조회

 

HotelRooms 테이블

room_nbr start_date end_date
101 2020-02-01 2020-02-06
101 2020-02-06 2020-02-08
101 2020-02-10 2020-02-13
202 2020-02-06 2020-02-08
202 2020-02-08 2020-02-11
202 2020-02-11 2020-02-12
303 2020-02-03 2020-02-17

 

SELECT room_nbr,
	SUM(end_date-start_date) AS working_days
FROM HotelRooms
GROUP BY room_nbr
HAVING SUM(end_date-start_date) >= 10;

 

'SQL' 카테고리의 다른 글

[SQL] 자르기  (0) 2020.09.03
[SQL] 어쩔 수 없는 UNION  (1) 2020.09.01
[SQL] 조건 분기 CASE,UNION 차이  (0) 2020.08.31
[SQL] SQL 조건 분기, 집합 연산, 윈도우 함수, 갱신  (0) 2020.08.30
[SQL] DBMS 아키텍처 Part 2  (0) 2020.08.29

댓글