KATA#20

codataffee·2024년 4월 29일
0

CODEKATA

목록 보기
20/114
post-thumbnail

WHAT IS KATA?

KATA는 기술과 기술 향상에 초점을 맞춘 코드 챌린지입니다.
일부는 프로그래밍 기본 사항을 교육하는 반면 다른 일부는 복잡한 문제 해결에 중점을 둡니다.

이 용어는 The Pragmatic Programmer 라는 책의 공동 저자인 Dave Thomas 가
무술에서 일본의 카타 개념을 인정하면서 처음 만들어졌습니다.
Dave의 개념 버전은 코드 카타를 프로그래머가
연습과 반복을 통해 기술을 연마하는 데 도움이 되는 프로그래밍 연습으로 정의합니다.


- SQL


✔️ 문제 #1: 저자, 카테고리 별 매출액 집계하기

✔️ 제출 쿼리

✔️ 쿼리 분석

#CTEs 테이블 만들어서 조합하는게 좀 재밌어지는중 :)
BOOK 테이블과 AUTHOR 테이블을 조인해서 필요한 칼럼들만 추출한 BKAR 테이블을 만들어놓고,
남은 SALES 테이블과 조인하여 조건과 그룹화 후 원하는 결과 출력하기
#총매출액 계산에서 오답을 냈는데.. 
각 그룹별 판매량 * 판매가격을 먼저 구한 후, 
그 값들의 합을 추출해야 총매출액이 나온다는 것이 헷갈렸었다.

WITH BKAR AS (
              SELECT A.AUTHOR_ID AI,
                     A.AUTHOR_NAME AN,
                     B.CATEGORY BC,
                     B.PRICE BP,
                     B.BOOK_ID BI
              FROM BOOK B INNER JOIN AUTHOR A
                   ON B.AUTHOR_ID = A.AUTHOR_ID
              )
              
SELECT BKAR.AI AUTHOR_ID,
       BKAR.AN AUTHOR_NAME,
       BKAR.BC CATEGORY,
       SUM(S.SALES * BKAR.BP) TOTAL_SALES
FROM BKAR INNER JOIN BOOK_SALES S
     ON BKAR.BI = S.BOOK_ID
WHERE S.SALES_DATE LIKE '2022-01%'
GROUP BY 1,3
ORDER BY 1,3 DESC


✔️ 문제 #2: 대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기

✔️ 제출 쿼리

✔️ 쿼리 분석

# 이 문제도 역시 CTEs 테이블 활용.
대여 기록 정보 테이블에서 대여 시작일이 8월에서 10월 사이인 데이터들을
CAR_ID 기준으로 그룹화하고, 그룹 내 행이 5개 이상인 것만 조회하는 RECORD 테이블 생성,

# 원래 대여 기록 정보 테이블에서 대여 시작일 조건을 동일하게 정해주고,
RECORD 테이블 내 CAR_ID와 동일한 CAR_ID 행들만 불러온 뒤
CAR_ID와 MONTH 기준으로 그룹화하여 원하는 칼럼들 추출!

WITH RECORD AS
              (   
               SELECT CAR_ID CI,
                      COUNT(CAR_ID) CNT
               FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
               WHERE MONTH(START_DATE) BETWEEN 8 AND 10
               GROUP BY CAR_ID
               HAVING COUNT(CAR_ID) >= 5
               )

SELECT MONTH(START_DATE) MONTH,
       CAR_ID,
       COUNT(CAR_ID) RECORDS
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE MONTH(START_DATE) BETWEEN 8 AND 10
      AND CAR_ID IN (SELECT R.CI
                     FROM RECORD R)
GROUP BY CAR_ID, MONTH(START_DATE)
HAVING COUNT(CAR_ID) != 0
ORDER BY MONTH, CAR_ID DESC


✔️ 문제 #3: 그룹별 조건에 맞는 식당 목록 출력하기

✔️ 제출 쿼리

✔️ 쿼리 분석

# 역시 CTEs 테이블 생성.
문제에서 리뷰를 가장 많이 작성한 회원의 리뷰들을 조회하라고 했기 때문에
리뷰를 가장 많이 작성한 회원을 골라내는 테이블 A를 생성하고,

# MEMBER_PROFILE 테이블과 REST_REVIEW 테이블을 조인하여 전체 테이블을 만들어 준 뒤,
MEMBER_ID 가 A 테이블의 MEMBER_ID 와 동일한 데이터만 추출하여
원하는 조건으로 조회!

WITH A AS ( 
           SELECT MEMBER_ID MI,
                  COUNT(*) CNT
           FROM REST_REVIEW
           GROUP BY MEMBER_ID
           ORDER BY 2 DESC
           LIMIT 1
           )
          
SELECT M.MEMBER_NAME,
       R.REVIEW_TEXT,
       DATE_FORMAT(R.REVIEW_DATE, '%Y-%m-%d') REVIEW_DATE
FROM MEMBER_PROFILE M INNER JOIN REST_REVIEW R
     ON M.MEMBER_ID = R.MEMBER_ID
WHERE M.MEMBER_ID IN (SELECT MI FROM A)
ORDER BY 3, 2


✔️ CHECK POINT

  • DATE 타입의 칼럼의 앞에 YEAR, MONTH, DAY 등의 함수로
    해당 값만 조회하는 방법이 있다는 것.
사용 예)
# 현재 날짜
SELECT GETDATE( )

# 년도
SELECT YEAR(GETDATE())

# 월
SELECT MONTH(GETDATE())

# 일
SELECT DAY(GETDATE())

profile
커피 좋아하는 데이터 꿈나무

0개의 댓글

관련 채용 정보