huginn muninn

[LEETCODE] 1193. Monthly Transactions I SQL, if와 case 본문

카테고리 없음

[LEETCODE] 1193. Monthly Transactions I SQL, if와 case

_maddy 2024. 6. 21. 17:41

https://leetcode.com/problems/monthly-transactions-i/description/?envType=study-plan-v2&envId=top-sql-50

 

# Write your MySQL query statement below
-- 월별, 국가별로 거래건수와 총액, 승인된 거래 건수와 총액을 찾는 sql 쿼리를 작성하세요. 

SELECT
    DATE_FORMAT(TRANS_DATE,"%Y-%m") AS MONTH,
    COUNTRY,
    COUNT(ID) AS TRANS_COUNT,
    SUM(IF(STATE='APPROVED',1,0)) AS APPROVED_COUNT,
    SUM(AMOUNT) AS TRANS_TOTAL_AMOUNT,
    SUM(CASE WHEN STATE="APPROVED" THEN AMOUNT ELSE 0 END) AS APPROVED_TOTAL_AMOUNT
FROM TRANSACTIONS
GROUP BY 
    DATE_FORMAT(TRANS_DATE,"%Y-%m"),
    COUNTRY
ORDER BY 1

 

월별, 국가별로 거래건수와 총액, 승인된 거래 건수와 총액을 찾는 sql 쿼리를 구현하는 것이 문제!

별로 어려운 문제는 아니였지만 case 문과 if문의 null 처리 방식에 대해 공부하기 좋다. 

 

NULL 처리:

  • CASE 문에서 ELSE 절을 생략하면 조건이 모두 false인 경우 NULL이 반환
SELECT 
    CASE WHEN score >= 90 THEN 'A'
         WHEN score >= 80 THEN 'B'
         WHEN score >= 70 THEN 'C'
    END AS grade
FROM students;

 

이 경우, score가 70 미만인 학생의 grade 값은 NULL이 됩니다.

 

  • IF 문에서 false_value를 생략하면 조건이 false인 경우 NULL이 반환
SELECT 
    IF(score >= 90, 'A',
       IF(score >= 80, 'B',
          IF(score >= 70, 'C')))
    AS grade
FROM students;

 

  •  이 경우, score가 70 미만인 학생의 grade 값은 NULL이 됩니다.

이와 같은 차이점 때문에, 상황에 따라 CASE 문 또는 IF 문을 선택할 때 NULL 처리에 대한 고려가 필요하다.

예를 들어, NULL 값을 특정 값으로 대체해야 하는 경우라면 ELSE 절 또는 false_value를 사용하여 명시적으로 처리해야한다.