백엔드/Oracle

Oracle : SQL ( CASE WHEN THEN / GROUP BY )

두개의 문 2023. 7. 11. 13:55
CASE 구문 : CASE WHEN THEN

 

- DECODE 함수를 조금 더 구체화하여 SELECT절의 구문형식으로 확장 가능 

   DECODE 함수와 같이 컬럼이나 표현식을 비교하여 결과값을 비교하여 조건에 맞는 결과값을 리턴함 

     → 특정 조건에 따라 값을 변경할 수 있는 수식으로, 주로 SELECT절에서 사용 

 

 - ① 단순형 CASE 구문 

    CASE 표현식 WHEN 비교조건1 THEN 결과1                     // 표현식과 비교조건1 비교 시, 같으면 결과1 리턴  
                         WHEN 비교조건1 THEN 결과1                     // 표현식과 비교조건2비교 시, 같으면 결과2 리턴   
                         WHEN 비교조건1 THEN 결과1                     // 표현식과 비교조건3 비교 시, 같으면 결과3 리턴  
                         ELSE 기본값                                                 // 표현식이 조건들과 같지 않은 경우, 기본값 리턴 
     END                                                                                 // CASE구문이 끝났다는 의미 

    ※ 표현식 : 하나 이상의 값과 연산자, 함수들이 결합된 식

 

 - ② 검색형 CASE 구문  

    CASE WHEN 조건식1 THEN 결과1                                   // 조건식1이 참인 경우, 결과1 리턴 
              WHEN 조건식2 THEN 결과2                                   // 조건식2이 참인 경우, 결과2 리턴 
                …
               ELSE 기본값                                                           // 위의 조건식 모두 거짓인 경우, 기본값 리턴 
    END 

 

 

SELECT 
		e.EMP_NAME, e.AGE,
		CASE WHEN e.AGE BETWEEN 0 AND 19 THEN '10대'
			 WHEN e.AGE BETWEEN 20 AND 29 THEN '20대'
			 WHEN e.AGE BETWEEN 30 AND 39 THEN '30대'
			 WHEN e.AGE BETWEEN 50 AND 59 THEN '50대'	
			 ELSE '60대 이상'
		END ages 
	FROM EMPLOYEE e ;

 

 

 


GROUP BY ~ HAVING

 

 - 목적 : 데이터분석의 가장 기본적인 단계로 데이터들을 특정 기준으로 모아 그 기준으로 집계하여 살펴보는 것 

   예 ) 과목별 반 학생들의 전체 평균점수는 얼마인가?

         최근 10년간 장마가 계속된 기간은 얼마인가?

   위와 같은 예시와 같이 이렇게 데이터를 모아 특정 기준으로 판단을 해야 원하는 목적을 찾을 수 있는 경우가 많음 

   이 때, 필요한 기초기술이 SQL의 집계해 결과를 조회하는 방법!

 

 - 구문 

  SELECT 컬럼명, …                                                    ①
             FROM 테이블명, …                                         ②
             WHERE 검색조건                                            ③
             GROUP BY 그룹으로 집계할 표현식                ④
             HAVING 그룹 결과에만 적용될 검색 조건         ⑤ 
             ORDER BY 컬럼명 [ ASC | DESC ] ;              ⑦

 

 

 - 실행되는 순서 

   : ② 테이블에서 ①원하는 컬럼을 ③검색조건으로 검색하여 

     ④그룹으로 모은 결과 ⑤그 그룹에서 원하는 조건을 적용하여 남은 결과들을 ⑥정렬조건에 맞춰 정렬하여 결과를 반환 

 

 

 - 사용방법 

  • 기본적으로 수집된 데이터들을 그룹으로 모아 집계함수를 이용해서 데이터를 처리하면 됨 

  • 해당 그룹에 대한 조건이 필요한 경우, WHERE절이 아닌 HAVING절을 이용하여 검색제한할 수 있음

  • 단, GROUP BY문에 명기된 컬럼이나 그룹을 만드는데 사용한 표현식은 반드시 SELECT 컬럼절에 명시해야 함 

 

 

- 집계함수 (Aggregate Function)

  • GROUP BY로 필터된 컬럼의 여러 레코드들을 입력값으로 하여 한 개의 원하는 결과(관점)을 반환하는 함수 

  • 대표적인 집계함수 

   ❶ COUNT(속성명) : 그룹별 튜플 수 구하는 함수 

       → 일반적으로 ‘*’ 기호 사용하여 전체 데이터 개수 구함 ( 이때, NULL값도 포함됨 )

   ❷ MAX(속성명) : 그룹별 최대값 구하는 함수    

   ❸ MIN(속성명) : 그룹별 최소값 구하는 함수 

   ❹ AVG(속성명) : 그룹별 평균 구하는 함수 

   ❺ SUM(속성명) : 그룹별 합계를 구하는 함수
   ❻ STDDEV(속성명) : 그룹별 표준편차 구하는 함수    

   ❼ VARIANCE(속성명) : 그룹별 분산 구하는 함수    

 

 

-- GROUP BY 예제
SELECT * FROM SUBWAY_STATISTICS ss ;
-- 지하철 역별로 역명만 조회 
SELECT 
  	station_name    
  	FROM SUBWAY_STATISTICS ss
   	WHERE GUBUN = '승차'
	GROUP BY station_name ; 

-- 집계함수 예제
SELECT 
	STATION_NAME "지하철역명",
	COUNT(*) "전체레코드 수",
	MIN(PASSENGER_NUMBER) "최저 승객수",
	MAX(PASSENGER_NUMBER) "최대 승객수",
	SUM(PASSENGER_NUMBER) "누적 승객수",
	ROUND( AVG(PASSENGER_NUMBER), 0 ) "평균 승객수"
	FROM SUBWAY_STATISTICS ss
	WHERE BOARD_TIME BETWEEN 7 AND 8
	GROUP BY STATION_NAME 
	HAVING STATION_NAME LIKE '잠%';