본문 바로가기

SQL/LeetCode

LeetCode / 1193. Monthly Transactions I / MySQL(Medium)

728x90

📚문제

출처 : LeetCode(https://leetcode.com/problems/monthly-transactions-i/?envType=study-plan-v2&envId=top-sql-50)


📝풀이

# Write your MySQL query statement below
SELECT LEFT(trans_date,7) AS month
     , country
     , COUNT(trans_date) AS trans_count
     , COUNT(CASE WHEN state = 'approved' THEN 1 END) AS approved_count
    #, SUM(CASE WHEN state = 'approved' THEN 1 ELSE 0 END) AS approved_count
     , SUM(amount) AS trans_total_amount
     , SUM(CASE WHEN state = 'approved' THEN amount END) AS approved_total_amount
FROM Transactions 
GROUP BY LEFT(trans_date,7), country

 

Medium 난이도에 비해 쉬운 문제였다

다만 한가지 주의할 점이 있다❗❗

 

5번째 코드에서  approved_count를 계산할 때

THEN 1 ELSE 0 이렇게 조건을 부여해줬다

그래서 머릿속에선 당연히 행 2개중에서 

approved인 경우는 1개니까 값이 1이 나올거라고 생각했는데 

2가 나왔다 (SUM으로 바꿔주면 1이 잘 나옴)

 

곰곰이 생각해보니까 그 이유는

approved가 아닌경우에는 NULL이 아닌 0이 들어가고

COUNT 함수에서 1인행, 0인행 처럼 NULL이 아닌 행의 개수를 카운트해서 2가 나오는 것이었다

 

그래서

COUNT 함수를 써서 ELSE 0 조건 대신 아무것도 작성하지 않은 다음( ELSE 작성하지 않으면 NULL 값)

NULL 값이 아닌 행 (state='approved'인 행)의 개수를 세거나

COUNT(CASE WHEN state = 'approved' THEN 1 END) AS approved_count

 

 

SUM 함수를 써서 

state = 'approved' 인 경우는 1 , 아닌 경우는 0으로 계산하여 더하면

state = 'approved' 인 행의 개수만큼의 합이 나온다

SUM(CASE WHEN state = 'approved' THEN 1 ELSE 0 END) AS approved_count

 

 

 

728x90