[내일배움캠프 데이터분석 사전캠프]+SQL

유기홍·2025년 4월 25일
post-thumbnail

📆 TIL: 2025.04.25 (금)


🧠 오늘 배운 내용 요약

🔁 서브쿼리 + JOIN + 조건문 복습

  • JOIN서브쿼리를 조합해 복잡한 조건 하에 그룹별 계산 수행
  • CASE WHEN 조건문을 통해 연령대별, 금액대별 그룹 분류 실습
  • 서브쿼리를 통해 중간 계산값을 저장하고, 이를 기반으로 외부 쿼리에서 추가 가공

🔄 Pivot 테이블 만들기 (열 전개 방식)

  • 연령대별 주문 수를 음식 종류별로 집계
  • GROUP BY + CASE 또는 IF() 조건 + SUM/MAX 사용
  • 피벗 테이블처럼 세로 값을 가로 열로 펼쳐내는 구조 연습

📌 오늘 SQL 문제

  1. 음식 타입별, 연령별 주문건수 pivot view 만들기 (연령은 10~59세 사이)
  2. SQL 기본구조 작성하기
  3. Pivot view 를 만들기 위해 필요한 데이터 가공하기
  4. Pivot view 문법에 맞추어 수정하기

⚠️처음 오답

select cuisine_type,
max if(age='10',cnt_order,0) "10대",
max if(age='20',cnt_order,0) "20대",
max if(age='30',cnt_order,0) "30대",
max if(age='40',cnt_order,0) "40대",
max if(age='50',cnt_order,0) "50대"
from
(
select cuisine_type,
	   case when age between 10 and 19 then 10
	   		when age between 20 and 29 then 20
	   		when age between 30 and 39 then 30
	   		when age between 40 and 49 then 40
	   		when age between 50 and 59 then 50 end age,
	   	count(1) cnt_order
from food_orders f inner join customers c on f.customer_id=c.customer_id
where age between 10 and 59
group by 1, 2)a
group by 1
❌ 오류 요약
  1. MAX IF(...) → ❌ SQL 표준에는 MAX IF()라는 함수가 없음
    MySQL에서는 MAX(IF(...)) 형식으로 써야 함.
-- ❌ 잘못된 예
MAX IF(age = '10', cnt_order, 0)

-- ✅ 올바른 예
MAX(IF(age = 10, cnt_order, 0))
  1. CASE 구문에서 ELSE 누락 시 NULL이 생길 수 있음
    → 이건 오류는 아니지만 명시적으로 ELSE NULL 또는 ELSE 0을 적어주는 게 좋음.

✅ 수정된 쿼리 전체

select cuisine_type,
	max(if(age="10",cnt_order,0)) "10대",
	max(if(age="20",cnt_order,0)) "20대",
	max(if(age="30",cnt_order,0)) "30대",
	max(if(age="40",cnt_order,0)) "40대",
	max(if(age="50",cnt_order,0)) "50대"
from
(
select f.cuisine_type,
	   case when age between 10 and 19 then 10
	   		when age between 20 and 29 then 20
	   		when age between 30 and 39 then 30
	   		when age between 40 and 49 then 40
	   		when age between 50 and 59 then 50 end age,
	   	count(1) cnt_order
from food_orders f inner join customers c on f.customer_id=c.customer_id
where age between 10 and 59
group by 1, 2) a
group by 1
📌 왜 띄어쓰기 하면 오류가 나는가?
  • SQL에서 MAX(IF(...))는 "MAX 함수의 인자로 IF를 넣는다"는 의미
    그런데 위처럼 띄어쓰기를 해버리면 SQL 파서가 이걸 "MAX"라는 함수가 아니라 MAX라는 컬럼이나 키워드, IF라는 함수 호출로 잘못 해석해버려
    결과적으로 "이런 함수가 없다", "구문이 이상하다"는 에러를 내게 됨.

💬 느낀 점

  • 서브쿼리 → 조건문 → 그룹화 → 윈도우 함수로 이어지는 SQL의 흐름을 직접 체험하며 익숙해졌음

  • 피벗 쿼리는 활용 범위가 넓어 많은 연습이 필요해보임.

  • 윈도우 함수는 집계 결과에 순위까지 매길 수 있어 실무에 자주 쓰일 것 같음.

0개의 댓글