ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 12/5
    스파르타/TIL(Today I Learned) 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로 해도 상관없지만 

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

     

    '스파르타 > TIL(Today I Learned)' 카테고리의 다른 글

    12/08  (0) 2023.12.08
    12/07  (2) 2023.12.07
    12/6  (3) 2023.12.06
    12/4  (3) 2023.12.04
    12/01  (1) 2023.12.01
Designed by Tistory.