[solvesql] 지역별 주문의 특징 (작성중)

juyeon·2023년 11월 22일
0

SQL

목록 보기
8/9

지역별 주문의 특징
난이도3
https://solvesql.com/problems/characteristics-of-orders/

오답..?

각 행이 곧 하나의 주문이라고 가정했을때 쿼리문

SELECT
  region AS Region,
  SUM(CASE WHEN category='Furniture' THEN 1 ELSE 0 END) AS Furniture,
  SUM(CASE WHEN category='Office Supplies' THEN 1 ELSE 0 END) AS "Office Supplies",
  SUM(CASE WHEN category='Technology' THEN 1 ELSE 0 END) AS Technology
FROM records
GROUP BY region
ORDER BY region ASC;
  • 문제에서 'region, category 별 주문량을 계산'을 요구했기에 각 행이 하나의 주문으로 생각했는데, 실패.
  • 다른 풀이를 검색해보니, order_id의 중복을 제거해야했다.
  • order_id가 같더라도, 즉 한 사람이 여러번 주문했더라도 세부 카테고리 항목이 다르거나 수량이 다른데, 왜 이걸 중복 주문으로 취급하는걸까? 이 부분을 문제에서 명시해줘야하는거 아닐까?

정답

1. 중복을 제거한 order_id의 수를 SELECT 해놓은 테이블에서 다시 SELECT 하기

SELECT
  region AS Region,
  SUM(CASE WHEN category='Furniture' THEN order_count ELSE NULL END) AS 'Furniture',
  SUM(CASE WHEN category='Office Supplies' THEN order_count ELSE NULL END) AS 'Office Supplies',
  SUM(CASE WHEN category='Technology' THEN order_count ELSE NULL END) AS 'Technology'
FROM (
  SELECT
    region,
    COUNT(DISTINCT(order_id)) AS order_count,
    category
  FROM records
  GROUP BY region, category
)
GROUP BY region
ORDER BY region;
  • order_id의 중복을 제거한 수량을 먼저 뽑고, 거기서 다시 그룹화 및 조건을 걸어 출력했다.
  • 보기에는 쿼리문도 길고, 결국 비슷한 작업을 여러번 수행해야하니까 비효율적으로 보인다.

2. 각 행뿐 아니라 주문 ID의 중복도 제거한 경우

SELECT
  region AS Region,
  COUNT(DISTINCT(CASE WHEN category='Furniture' THEN order_id ELSE NULL END)) AS 'Furniture',
  COUNT(DISTINCT(CASE WHEN category='Office Supplies' THEN order_id ELSE NULL END)) AS 'Office Supplies',
  COUNT(DISTINCT(CASE WHEN category='Technology' THEN order_id ELSE NULL END)) AS 'Technology'
FROM records
GROUP BY region
ORDER BY region;
  • 위와 같이 order_id의 중복을 제거한 수량을 세되, 바로 출력.
  • 훨씬 간단하다. 이게 아마 모범답안이 아닐까?
profile
내 인생의 주연

0개의 댓글