[SQL테스트]가구 판매의 비중이 높았던 날 찾기

김준석·2024년 2월 4일

코딩테스트 - SQL

목록 보기
58/96

문제

https://solvesql.com/problems/day-of-furniture/
전체 카테고리 중 'Furniture' 카테고리의 주문 비중을 알아보는 문제

코드

WITH c_fu AS( --furniture 수
  SELECT
    order_date,
    order_id,
    COUNT(DISTINCT order_id) AS fu_cnt
  FROM 
    records
  WHERE 1=1
    AND category ='Furniture'
  GROUP BY
    order_date
),
c_all AS(-- 전체 카테고리 수
  SELECT
    order_date,
    order_id,
    COUNT(DISTINCT order_id) AS all_cnt
  FROM
    records
  GROUP BY
    order_date
)
SELECT
  c_all.order_date,
  c_fu.fu_cnt AS furniture,
  -- c_all.all_cnt,
  ROUND((CAST(c_fu.fu_cnt AS float)/c_all.all_cnt)*100,2) AS furniture_pct
FROM 
  c_fu
  RIGHT JOIN c_all
    ON c_fu.order_date=c_all.order_date
WHERE 1=1
 AND c_all.all_cnt>=10
 AND furniture_pct>=40
ORDER BY
  furniture_pct DESC,
  c_all.order_date

나는 furniture 카테고리 주문 수와 전체 카테고리 주문 수를 CTE로 만들어서 진행했다.
그런데!!! 진짜 이해가 안되는 부분이 있다.
왜 COUNT 할때 DISTINCT를 사용해야 되는가?
같은 고객이 하루에 의자, 책상을 구매할 수 있는데 그럼 2개로 카운트해야지 왜 1개로 카운트하려고 하는건지 이해가 안된다.
그럴거면 해설에 좀 더 설명을 넣어놓지...
주문자를 기준으로 하라고 말이다....!!!!!!!!

  • SQLite는 계산시 실수로 변경해주지 않으니 CAST 함수로 실수 처리 진행

아래는 CTE사용하지 않고 풀어본 거다.

SELECT
  order_date,
  COUNT(DISTINCT CASE WHEN category='Furniture' THEN order_id END) AS furniture,
  ROUND(COUNT(DISTINCT CASE WHEN category='Furniture' THEN order_id END)/
    CAST(COUNT(DISTINCT order_id) AS FLOAT)*100,2) AS furniture_pct
FROM 
  records
GROUP BY
  order_date
HAVING 1=1
  AND COUNT(DISTINCT order_id)>=10
  AND furniture_pct>=40
ORDER BY
  furniture_pct DESC,
  order_date

0개의 댓글