오늘도 어김없이 프로그래머스 문제를 풀다가
막혀 !도움을 하던중
정말 깔끔하게 짠 코드를 보고
이해하며 감탄한 코드가 있어 가져와봤다.
문제 : 데이터 분석 팀에서는 우유(Milk)와 요거트(Yogurt)를 동시에 구입한 장바구니가 있는지 알아보려 합니다. 우유와 요거트를 동시에 구입한 장바구니의 아이디를 조회하는 SQL 문을 작성해주세요. 이때 결과는 장바구니의 아이디 순으로 나와야 합니다.
cart_products의 테이블이다.
보면 name에 두가지 조건
1. name = 'Milk'
2. name = 'Yogurt'
를 동시에 만족해야 한다
하지만 그냥 코드를 한번에 작성해서 하려면
두 조건을 동시에 만족하기는 어렵다.
그래서 서브쿼리로 조건 한개를 처리한 후
나머지 조건을 처리하는 방법을 소개하려한다.
-- 코드를 입력하세요
SELECT distinct cart_id
from cart_products
where name = 'Yogurt' and
cart_id in (select cart_id from cart_products where name='Milk')
코드는 위와 같다.
여기서 주목할 점은 메인 쿼리에서의 where절이다.
메인 쿼리는 name이라는 조건을 걸었고
서브쿼리에는 cart_id로 걸어놨다
우리가 추출할 내용은 cart_id이기 때문에
cart_id = ()하고 조건을 해결한 모습이다
또한 서브쿼리의 결과가 1개 이상의 row를 반환하기 때문에
다중 연산자인 IN을 써주었다!
내가 여기서 놀란 점은 바로 cart_id로 조건을 준 서브쿼리이다.
나는 처음에 서브쿼리를 사용할 때 name = ()
이런 형태로 주었지만
돌이켜 생각해 보면 이 조건은 말이 안되는 조건이 였다..ㅠ
우리가 추출할 data를 조건으로 걸어
두가지 조건을 한번에 처리하는 쿼리가 매우 인상적이였다.
https://school.programmers.co.kr/learn/courses/30/lessons/62284#qna
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 :
7월 아이스크림 총 주문량과 상반기의 아이스크림 총 주문량을 더한 값이 큰 순서대로 상위 3개의 맛을 조회하는 SQL 문을 작성해주세요.
두 테이블 다 같은 데이터 형식을 가진다.
이 문제를 가져온 이유는
내가 생각한 코드가 또 틀렸기 때문이다.
나는 문제가 없다고 판단했지만
어김없이 "정답이 아닙니다"라는
문구가 나를 반겨주었다.
select flavor
from (
SELECT j.flavor, sum(j.total_order) + sum(f.total_order) as SUM1
from JULY j
inner join first_half f
on j.SHIPMENT_ID =f.SHIPMENT_ID
group by j.flavor
order by 2 desc
limit 3
) a
위 코드는 내가 작성한 코드이다.
SELECT flavor
FROM (
SELECT flavor, SUM(total_order) AS total_sum
FROM (
SELECT flavor, total_order FROM JULY
UNION
SELECT flavor, total_order FROM first_half
) AS combined_data
GROUP BY flavor
ORDER BY total_sum DESC
LIMIT 3
) AS top_flavors;
이 코드는 정답 코드이다.
보면 아래 코드는 두개의 테이블을 UNION으로
합쳐서 총 합을 더하고 상위 3개를 구하는 것이다.
내 코드는 각각의 합을 더해서 순위를 매기는 것이였다.
하지만 두 개를 조회해보니 정답의 코드가 총 합이 더 많이 나왔다.
즉, 나의 코드는 잘못된것이다.!!
여기서 핵심은 UNION으로 합친것이다.
UNION ALL로 해도 상관없지만
두개의 테이블을 합쳐서 총 합을 구하는것이다.