본문 바로가기

TIL

[231219] SQL: 코드카타 60~65

1) 어떤 문제가 있었나

SQL 코드카타 중

① 자동차 대여 일수를 구하는 문제에서 두 개의 날짜값의 일수 차이를 구할 때 (종료일 - 시작일)로 계산하니 오류 발생함

장바구니에 우유(Milk)와 요거트(Yogurt)를 동시에 구입한 장바구니 id를 조회해야 했는데, 동일한 품목을 중복 구매한 값을 제거한 장바구니ID 추출에 어려움을 겪음  

 

2) 내가 시도해본 건 무엇인가

날짜 차이를 추출할 수 있는 함수를 구글링하여 DATEDIFF 함수를 적용해봄 

우유와 요거트를 1과 100 숫자값으로 치환한 후 합계값이 101~199 사이인 장바구니 ID 추출하여 정답 완료

하지만, 데이터 정보량이 많을 경우 오류 발생할 것으로 판단됨 

 

3) 어떻게 해결했나

DATEDIFF 를 활용한 후, 자동차 대여 시작일자를 +1 포함하여 정답 도출 

② 정답 작성 후, 추가 풀이 확인하여 다른 접근 방식에 대해 공부

--- 내가 쓴 쿼리문 --- 

SELECT CART_ID
FROM(
SELECT CART_ID, NAME, IF(NAME='Yogurt', 1, 100) MY
  FROM CART_PRODUCTS
 WHERE NAME IN ('Milk', 'Yogurt')
 GROUP BY 1, 2
 ORDER BY 1) A
 GROUP BY 1 
        HAVING SUM(MY) BETWEEN 101 AND 199

---  추가 풀이 --- 
(1) group_concat 적용하여 장바구니 ID 별로 품목을 하나의 칼럼에 넣은 뒤, WHERE IN 절로 추출 
(2) join을 활용해 동일한 시트를 합치고, where and 절로 원하는 조건 추출
(3) 요거트와 밀크가 포함된 값을 추출할 때, 각각 중복으로 집계된 cart_id는 제거(group by or distinct) 
> 서브쿼리로 넣고, group by having 절로 조건 추가  

 

4) 무엇을 새롭게 알았나

- DATA_FORMAT 외에도 YEAR, MONTH , DAY 함수가 있어 바로 날짜 정보 뽑기 가능함

- DATEDIFF : 년(year)/월(month)/일(day)/주(week)/시(hour)/분(minute)/(second) 등의 차이를 구할 수 있는 함수 

┗ 일자 예시: DATEDIFF ('day', 종료일자 칼럼, 시작일자 칼럼)

- group_concat(칼럼명): 동일 그룹 내 문자열을 쉼표(,) 기준으로 구분하여 나열 
└ GROUP_CONCAT(칼럼명 SEPARETOR '원하는구분자') : 구분자를 바꾸고 싶을 때 
└ GROUP_CONCAT(DISTINCT 칼럼명) : 중복되는 문자열은 제거하고 싶을 때  
└ GROUP_CONCAT(칼럼명 ORDER BY 칼럼명) : 문자열 정렬이 필요할 때 
└ GROUP_CONCAT(DISTINCT 칼럼명 ORDER BY 칼럼명 SEPARETOR '-') : 다수 조건 넣을 때는 중복 제거 > 정렬 > 구분자 변경 순으로 적용