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 |