[SQL] SQL 과제 풀이와 데이터 리터러시
지난주에 주어졌던 SQL을 풀고, 오늘 그 풀이를 들었다.
답안지와 내 답을 비교하고, 값이 다른 부분은 왜 다른건지 분석해보려고 한다.
마지막으로는 오늘 배운 데이터 리터러시에 대해 정리하고자 한다.
SQL 과제
1번
list_of_orders에는 여러 주문들의 날짜가 저장되어 있고, 주문 날짜는 'dd-mm-yyyy' 형식으로 저장되어 있다. 이 테이블에서 가장 이른 주문 날짜 찾기
작성 전
이른 주문 날짜 -> min
날짜 형식 -> str_to_date
작성 전 단계를 거쳐 필요한 함수를 선정하고, 코드를 작성하였다.
작성한 코드의 결과가 내가 지정한 '%d-%m-%Y'의 형식이 아니었다.
str_to_date만 따로 써보았는데도 안되는거 보면 select에서 제대로 적용이 안되는 거 같아 보인다 ㅠ
혹시 문자열이 아닌걸까?? 싶어서 확인해 보았는데, varchar로 가변의 문자열인것도 확인했다.
4번
list_of_orders와 order_details 테이블을 사용하여 3개 이상의 주문을 한 고객들의 이름, 총 주문 횟수, 그들의 총 구매액을 계산
작성 전
테이블 간 join
총 주문 횟수 -> count
총 구매액 -> sum
그들의 -> 그룹 -> group by
3개 이상의 주문 -> 조건 -> where /having
작성 전 과정을 거친 결과
이러한 코드와 결과가 나왔다.
오늘 강의를 듣고, count(distinct)를 사용해야 한다는 것을 알았다.
그래서 왜 distinct를 사용해야하는지 알아보았다.
두 테이블의 조인 결과에서 고객 중 한 명을 지정해 order_id를 추출해보았다.
그 결과 동일한 id가 여러 번 도출되는 것을 보았고, 이러한 중복값을 없애기 위해 distinct를 사용한다는 것을 알 수 있었다.
7번
list_of_orders, order_details, sales_target 테이블을 사용하여 각 주별로 주문의 총 금액과 이익을 계산하고, 각 주 내에서 주문의 매출 순위를 결정하고 각 주문의 총 금액이 해당 카테고리의 평균 매출 목표의 50%를 달성했는지 여부도 판단
작성 전
세 테이블 join
총 금액 -> sum
총 이익 -> sum
매출 순위 -> rank() over (partiton by)
총금액, 카테고리, 평균 매출목표 -> group by
평균 매출액 avg
달성 여부 -> 조건 -> case/if
서브쿼리 필요
위의 과정을 통해 아래와 같은 코드를 작성하였다.
내가 작성한 코드와 답안지의 코드가 다를뿐만 아니라 도출되는 값 또한 달라 어딘가 잘못되었다는 것을 알게 되었다.
바로 이 코드가 정답 코드인데, 내 코드와 크게 다른 부분은 with이다.
WITH
하나의 서브 쿼리 또는 임시 테이블
이 문제를 풀면서 with이라는 새로운 절을 알게 되었고, with을 사용하면 서브쿼리의 역할과 동시에 보기 쉽게 작성할 수 있다는 것을 알 수 있었다.
데이터리터러시
데이터리터러시란?
데이터를 읽고 이해하고 비판적으로 분석해 의사소통에 활용하는 것이다.