Gaegul's devlog

[프로그래머스 SQL KIT] GROUP BY 본문

Computer Science/SQL

[프로그래머스 SQL KIT] GROUP BY

부지런깨꾹이 2022. 11. 3. 23:05
728x90
반응형

sql 문제가 나오는 기업의 코딩 테스트를 준비하느라 다~~~ 까먹어버렸던 sql 공부를 다시 해본다..

https://school.programmers.co.kr/learn/courses/30/parts/17044

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

프로그래머스 SQL KIT 에서 충분히 연습을 해볼 수 있기 때문에 그리 어렵지는 않지만, 그래도 모르는 기초 문법은 없어야 하기에 이렇게 정리로 끄적여 본다 😂 공부하면서 가장 어렵게 느껴졌던 GROUP BY 파트와 JOIN 파트로 나눠서 정리해 볼것이다. 

가장 일반적으로 사용하는 문법 : SELECT - FROM - WHERE - GROUP BY - HAVING - ORDER BY - LIMIT 으로 차례대로 사용하게 되지만 실행되는 순서는 FROM으로 테이블 부터 확인 하고 WHERE (조건) - GROUP BY - HAVING - SELECT(출력) - ORDER BY(출력) - LIMIT (출력) 순이다. 이걸 잘 기억하고 풀어보자!!

GROUP BY는 SELECT 할 수 있는 것이 집계 함수로 제한된다.

더보기

1. SUM 

2. COUNT
3. MIN/MAX
4. AVG

 

 

문제 1. 식품분류별 가장 비싼 식품의 정보 조회하기 (level 4)

 

문제

FOOD_PRODUCT 테이블에서 식품분류별로 가격이 제일 비싼 식품의 분류, 가격, 이름을 조회하는 SQL문을 작성해주세요. 이때 식품분류가 '과자', '국', '김치', '식용유'인 경우만 출력시켜 주시고 결과는 식품 가격을 기준으로 내림차순 정렬해주세요.

[FOOD_PRODUCT]

PRODUCT_ID         PRODUCT_NAME                           PRODUCT_CD                                CATEGORY          PRICE

P0018 맛있는고추기름 CD_OL00008 식용유 6100
P0019 맛있는카놀라유 CD_OL00009 식용유 5100
P0020 맛있는산초유 CD_OL00010 식용유 6500
P0021 맛있는케첩 CD_SC00001 소스 4500
P0022 맛있는마요네즈 CD_SC00002 소스 4700
P0039 맛있는황도 CD_CN00008 4100
P0040 맛있는명이나물 CD_CN00009 3500
P0041 맛있는보리차 CD_TE00010 3400
P0042 맛있는메밀차 CD_TE00001 3500
P0099 맛있는맛동산 CD_CK00002 과자 1800

출력

CATEGORY                                     MAX_PRICE                                PRODUCT_NAME

식용유 6500 맛있는산초유
과자 1800 맛있는맛동산

다음 문제에서 주의 깊게 봐야하는 부분은 세 가지 이다.

1)  카테고리로 그룹을 묶되 PRICE 가 가장 큰 값만 출력해야 한다.

2) 조건에 카테고리가 ('과자', ' 국', '김치', '식용유') 인 것만 출력

3) MAX_PRICE 를 내림차순으로 정렬

SELECT CATEGORY, PRICE AS 'MAX_PRICE', PRODUCT_NAME
FROM FOOD_PRODUCT
WHERE PRICE IN (SELECT MAX(PRICE) #조건 1: 카테고리별로 가격중에 max인 얘들만
	FROM FOOD_PRODUCT
    	GROUP BY CATEGORY) 
    		AND CATEGORY IN ('과자', '국', '김치', '식용유') #조건 2
ORDER BY MAX_PRICE DESC

* WHERE 절 안에 IN (~ 요 안에 들어있는 얘들 출력)을 써서 한번 더 조건을 걸어준다. 

 

문제 2. 즐겨찾기가 가장 많은 식당 정보 출력하기 (level 3)

문제

REST_INFO 테이블에서 음식종류별로 즐겨찾기수가 가장 많은 식당의 음식 종류, ID, 식당 이름, 즐겨찾기수를 조회하는 SQL문을 작성해주세요. 이때 결과는 음식 종류를 기준으로 내림차순 정렬해주세요.

REST_INFO 테이블

REST_ID   REST_NAME  FOOD_TYPE  VIEWS  FAVORITES  PARKING_LOT  ADDRESS   TEL

00001 은돼지식당 한식 1150345 734 N 서울특별시 중구 다산로 149 010-4484-8751
00002 하이가쯔네 일식 120034 112 N 서울시 중구 신당동 375-21 NULL
00003 따띠따띠뜨 양식 1234023 102 N 서울시 강남구 신사동 627-3 1F 02-6397-1023
00004 스시사카우스 일식 1522074 230 N 서울시 서울시 강남구 신사동 627-27 010-9394-2554
00005 코슌스 일식 15301 123 N 서울특별시 강남구 언주로153길 010-1315-8729

출력

FOOD_TYPE                REST_ID                                    REST_NAME                                                         FAVORITES

한식 00001 은돼지식당 734
일식 00004 스시사카우스 230
양식 00003 따띠따띠뜨 102
SELECT FOOD_TYPE, REST_ID, REST_NAME, FAVORITES
FROM REST_INFO
WHERE (FAVORITES, FOOD_TYPE) IN (SELECT MAX(FAVORITES), FOOD_TYPE 
                               FROM REST_INFO GROUP BY FOOD_TYPE)
ORDER BY FOOD_TYPE DESC

1번 문제와 비슷한 유형의 문제이다.

 

문제 3. 입양 시각 구하기(2)

문제

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

출력 

HOUR                       COUNT

0 0
1 0
2 0
3 0
4 0
5 0
6 0
7 3
8 1
9 1
10 2
11 13
12 10
13 14
14 9
15 7
16 10
17 12
18 16
19 2
20 0
21 0
22 0
23 0

 

이번 문제는 막연히 DATETIME에서 HOUR 만 뽑아서 그 갯수를 세는 문제가 아니다.

출력에서 볼 수 있듯이 0시 ~ 23 시가 모두 출력되고 이에 해당되는 갯수가 출력되어야 한다.  그러므로 SET 함수를 이용하여 초기 변수를 정해주어야 한다.  

1 씩 증가한 HOUR 가 출력되어야 하고 1씩 증가되는 변수와 같으면 갯수를 세도록 코드를 작성해 주어야 한다.

여기서 잠깐‼️‼️‼️‼️‼️‼️ 변수 지정과 DATE을 처리하는 방법에 대해 알아보자.

변수명 지정

변수 명을 지정해주기 위해서는 SET @변수명 = ...;  형태로 변수를 선언하고 다음과 같이 사용한다.

SET @HOUR = -1; 

 

날짜 추출

- YEAR(DATETIME) => 2022..           (년도만 추출)

- MONTH(DATETIME)

- HOUR(DATETIME) => 1,2,3,4,...23 (시간만 추출)

날짜형 변환

- DATE_FORMAT(날짜, '%Y-%m-%d') 

SET @HOUR = -1;
SELECT (@HOUR := @HOUR +1) AS 'HOUR',
    (SELECT COUNT(HOUR(DATETIME)) 
    FROM ANIMAL_OUTS 
    WHERE HOUR(DATETIME)=@HOUR) AS 'COUNT'
FROM ANIMAL_OUTS
WHERE @HOUR < 23; #조건을 안달아주면 +1 증가가 끝없이 간다. (필수)
728x90
반응형
Comments