본문 바로가기

TIL

[231220] SQL: 코드카타 66~70

1) 어떤 문제가 있었나

① 조회수가 가장 많은 중고거래 게시판 첨부파일 조회하기

with 절을 활용해 게시판ID 별 MAX 값을 뽑았으나 오답 처리

WITH TABLE1 AS (SELECT BOARD_ID, MAX(VIEWS)

                               FROM USED_GOODS_BOARD)

 

SELECT CONCAT('/home/grep/src/', BOARD_ID,'/', FILE_ID, FILE_NAME, FILE_EXT) FILE_PATH

FROM USED_GOODS_FILE

WHERE BOARD_ID = (SELECT BOARD_ID FROM TABLE1)

ORDER BY FILE_ID DESC

 

② 주문량이 많은 아이스크림들 조회하기

정답을 맞추긴 하였으나 쿼리문이 다소 긴 것 같아 다른 답을 찾아봄 

WITH FH AS (SELECT FLAVOR, SUM(TOTAL_ORDER) FH_SUM

                      FROM FIRST_HALF

                      GROUP BY 1) ,

           JU AS (SELECT FLAVOR, SUM(TOTAL_ORDER) JU_SUM

                      FROM JULY

                      GROUP BY 1)

SELECT FH.FLAVOR

FROM FH

LEFT JOIN JU ON FH.FLAVOR=JU.FLAVOR

order by (FH_SUM+JU_SUM) desc

limit 3

 

③ 대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기

SELECT MONTH(START_DATE) MONTH, car_id CAR_ID, COUNT(*) RECORDS

FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY

WHERE (car_id) IN (SELECT car_id

                              FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY

                              WHERE substring(start_date,1,10) BETWEEN '2022-08-01' AND '2022-10-31'

                             GROUP BY 1

                              HAVING COUNT(*) >=5)

GROUP BY 1, 2

HAVING COUNT(*) <> 0

ORDER BY 1, 2 DESC

 

2) 내가 시도해본 건 무엇인가

JOIN으로도 가능한지 쿼리를 써보았으나 어떤 부분 때문에 오답이 발생하는지 이해가 안되어, 다른 답을 찾아봄 

② 다른 답을 찾아보고 UNION 함수를 알게됨 

③ WITH절로도 빼보고, JOIN도 해보았으나 계속 오답 처리됨 

 

3) 어떻게 해결했나

문재상 최대 조회수 - MAX(VIEWS) -가 고유한 값이므로, 게시판ID 기준이 아니라 조회수 기준으로 WHERE절을 수정함

SELECT CONCAT('/home/grep/src/', BOARD_ID,'/', FILE_ID, FILE_NAME, FILE_EXT) FILE_PATH

FROM USED_GOODS_BOARD

INNER JOIN USED_GOODS_FILE USING (BOARD_ID)

WHERE VIEWS = (SELECT MAX(VIEWS) FROM USED_GOODS_BOARD)

ORDER BY FILE_ID DESC

 

② UNION 함수 활용법을 구글링해서 찾아서 새롭게 작성해서 정답 도출

SELECT FLAVOR

FROM (SELECT FLAVOR, SUM(TOTAL_ORDER) SUM

            FROM FIRST_HALF

            GROUP BY 1

            UNION ALL

            SELECT FLAVOR, SUM(TOTAL_ORDER) SUM

            FROM JULY

            GROUP BY 1 ) A

GROUP BY 1

ORDER BY SUM(SUM) DESC

LIMIT 3

 

WHERE절에 삽입한 서브쿼리에 적용한 날짜 조건이 마지막 쿼리에도 적용될 것이라고 착각한 것을 알게되고, 날짜 조건절을 2번 넣어줌 

SELECT MONTH(START_DATE) MONTH, car_id CAR_ID, COUNT(*) RECORDS

FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY

WHERE (car_id) IN (SELECT car_id

                                FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY

                                WHERE substring(start_date,1,10) BETWEEN '2022-08-01' AND '2022-10-31'

                                GROUP BY 1

                                HAVING COUNT(*) >=5)

              AND substring(start_date,1,10) BETWEEN '2022-08-01' AND '2022-10-31'

GROUP BY 1, 2

HAVING COUNT(*) <> 0

ORDER BY 1, 2 DESC

 

 

4) 무엇을 새롭게 알았나

- 어떤 항목의 최대값을 뽑은 후, 그에 대한 데이터를 뽑아야 하는 문제는 WHERE과 서브쿼리를 똑똑하게 써야 함. 서브쿼리에 조건을 걸었다고 최종 데이터에도 제대로 필터링 되는 것이 아니니 주의 필요 

UNION : 컬럼명과 데이터 타입이 동일한 쿼리문을 합쳐주는 명령어. 신규 열이 생성돼 수평결합하는 JOIN과 달리, 신규 행이 추가되어 수직 형태로 데이터가 붙음. 
UNION : 중복값은 제거하고 보여줌 (UNION ALL보다 속도가 느림)
UNION ALL : 중복된 값을 모두 보여줌  

 

'TIL' 카테고리의 다른 글

[231222] SQL: 코드카타 72~74  (0) 2023.12.22
[231221] SQL: 코드카타 71  (1) 2023.12.21
[231219] SQL: 코드카타 60~65  (0) 2023.12.19
[231218] SQL: 코드카타 55~59  (1) 2023.12.18
[231215] Phython: 실습 - 프로덕트 개선  (1) 2023.12.15