Algorithm๐Ÿค/SQL

[๋ฆฌํŠธ์ฝ”๋“œ] 1193. Monthly Transactions I - group by ์ปฌ๋Ÿผ์—์„œ null, count(*), sum(case๋ฌธ)โœ…

ํŒŒ์นดํŒŒ์˜ค 2024. 5. 29. 12:30

 

# ๋ฌธ์ œ

https://leetcode.com/problems/monthly-transactions-i/description/

 

# ๋ฌธ์ œ ์„ค๋ช…

 

 

# ํ—ท๊ฐˆ๋ ธ๋˜ ๋ถ€๋ถ„๋“ค

 

1. group by ์ปฌ๋Ÿผ1, ์ปฌ๋Ÿผ2๋กœ ๋ฌถ์€ํ›„ count()๋ฅผ ํ• ๋•Œ count(*)๋ฅผ ํ•˜๋ฉด null๊ฐ’๊นŒ์ง€ ์„ธ๋ฒ„๋ฆฌ๋Š”๊ฒŒ ์•„๋‹๊นŒ?

 

Q) group by ์ปฌ๋Ÿผ1, ์ปฌ๋Ÿผ2๋ฅผ ํ•  ๋•Œ ์ปฌ๋Ÿผ1์ด๋‚˜ ์ปฌ๋Ÿผ2์— null๊ฐ’์ด ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ์„๊นŒ? ๋งŒ์•ฝ ๋“ค์–ด๊ฐ„๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•˜๋‚˜?

 

2. with๋ฌธ์œผ๋กœ ๋”ฐ๋กœ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค์ง€ ์•Š๊ณ  ์กฐ๊ฑด์— ๋”ฐ๋ผ์„œ sum()์„ ํ•  ์ˆ˜๋Š” ์—†์„๊นŒ?

 

 

# ํ•ต์‹ฌ ๊ฐœ๋…

 

1. GROUP BY๋Š” NULL ๊ฐ’๋„ ๊ทธ๋ฃนํ™”ํ•ฉ๋‹ˆ๋‹ค.

 

๋”ฐ๋ผ์„œ COUNT(*)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ทธ๋ฃน์˜ ์ „์ฒด ํ–‰ ์ˆ˜๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ์…€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๋ฐ˜๋ฉด์— ํŠน์ • ์ปฌ๋Ÿผ์— ๋Œ€ํ•ด NULL ๊ฐ’์„ ์ œ์™ธํ•˜๊ณ  ๊ฐœ์ˆ˜๋ฅผ ์„ธ๊ณ ์ž ํ•œ๋‹ค๋ฉด, COUNT(column1) ๋˜๋Š” COUNT(column2)๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

 

๊ทธ๋ฆฌ๊ณ  ์ด๋ฒˆ ๋ฌธ์ œ์™€ ๊ฐ™์ด ๊ฐœ์ˆ˜๋ฅผ ์„ธ๋Š” ๊ฒฝ์šฐ count(*)๋ฅผ ํ•ด๋„ ๋ฌด๋ฐฉํ•˜๋‹ค

 

๊ทธ๋Ÿฌ๋‚˜ count(*)๊ณผ count(์ปฌ๋Ÿผ)์€ ๋‹ค๋ฅด๋‹ค

 

๋งŒ์•ฝ group by ์ปฌ๋Ÿผ1, ์ปฌ๋Ÿผ2์ค‘ null๊ฐ’์ด ๋“ค์–ด๊ฐ„ ๊ทธ๋ฃน์„ ํ•„ํ„ฐ๋งํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด count(์ปฌ๋Ÿผ)์„ ํ•˜๋ฉด ๋œ๋‹ค

 

 

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž

 

count(*) - ๋‹ค์Œ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ–ˆ์„๋•Œ

 

๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค

 

 

count(์ปฌ๋Ÿผ) - ๋‹ค์Œ ์ฟผ๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ–ˆ์„๋•Œ country๊ฐ€ null์ธ ๊ทธ๋ฃน์€ ๋‚˜์˜ค์ง€ ์•Š๊ฒŒ ๋œ๋‹ค

 

 

 

2. SUM(CASE WHEN ์กฐ๊ฑด THEN ๊ฐ’ ELSE ์•„๋‹๋•Œ๊ฐ’ end)

 

๋จผ๊ฐ€ ํŒŒ์ด์ฌ์˜ ์‚ผํ•ญ์—ฐ์‚ฐ์ž 

๊ฐ’ if ์กฐ๊ฑด else ์•„๋‹๋•Œ๊ฐ’

๊ณผ ๋น„์Šทํ•œ ๋А๋‚Œ์ด๋‹ค

 

 

# ๋‚ด๊ฐ€ ์“ด ์ •๋‹ต์ฝ”๋“œ

with new_table as (
    select date_format(trans_date, '%Y-%m') as month,
           country,
           case when state = 'approved' then 1
                else 0 end as state_cnt,
           amount
    from Transactions
)

select month, 
       country,
       count(*) as trans_count,
       sum(state_cnt) as approved_count,
       sum(amount) as trans_total_amount,
       sum(state_cnt * amount) as approved_total_amount
from new_table
group by month, country

 

 

# ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ์“ด ์ •๋‹ต์ฝ”๋“œ

SELECT DATE_FORMAT(trans_date, '%Y-%m') as month
        , country
        , COUNT(*) as trans_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 ELSE 0 end) as approved_total_amount
FROM transactions
GROUP BY month, country