DDG 2023. 12. 5. 16:30

오늘도 어김없이 프로그래머스 문제를 풀다가

막혀  !도움을 하던중

정말 깔끔하게 짠 코드를 보고

이해하며 감탄한 코드가 있어 가져와봤다.

문제 : 데이터 분석 팀에서는 우유(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로 해도 상관없지만 

두개의 테이블을 합쳐서 총 합을 구하는것이다.