5/8 TIL

정희린·2025년 5월 8일


경 축 우수 프로젝트 되다~~~!
무려 22조 중에 1등이라니..
밤늦게까지 고생한 보람이 있다 ㅠㅠ
이 모든 영광을 팀장님께 돌립니다...
요새 기분이 우울했는데 뭔가 선물 받은 것 같고 좋다.. ㅎㅎ
내일부터 시작되는 프로젝트도 파이팅..

SQL 코드카타

95. Queries Quality and Percentage

#오답
with rat as (
select query_name, count(rating) as cnts
from queries
where rating<3
group by query_name
)

select q.query_name,
       round(sum(q.rating / q.position) / count(q.query_name), 2) as quality,
       round((r.cnts / count(q.query_name))*100, 2) as poor_query_percentage
from queries q
left join rat r on q.query_name = r.query_name
group by q.query_name

무조건 with 구문으로 풀려고 하다가 ,, 정답이 다르게 나와서 다른 사람의 풀이를 참고했다.

select query_name,
       round(sum(rating / position) / count(query_name), 2) as quality,
       round(sum(case when rating < 3 then 1 else 0 end)*100 / count(*), 2) as poor_query_percentage
from queries 
group by query_name

case when 문으로 쓰면 훨씬 간단해지는데.. 익숙해지자 🥹

96. Monthly Transactions I

#오답
select date_format(trans_date, '%Y-%m') as month,
       country,
       count(state) as trans_count,
       count(case when state='approved' then id 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 1, 2

아무리 해도 approved_count 가 다르게 나오길래 지피티한테 이유를 물어봤다

select date_format(trans_date, '%Y-%m') as month,
       country,
       count(state) as trans_count,
       count(case when state='approved' then 1 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 1, 2

생각해보니 당연히 count는 else 0으로 반환한 값도 세기 때문에.. case when문을 쓸 땐 sum으로 하거나 else 0을 지워줘야 함..!

97. Immediate Food Delivery II

#오답
With imme as (
select count(*) as cnts,
           customer_pref_delivery_date
    from delivery
    group by customer_id
    having min(order_date)=customer_pref_delivery_date
)

select cnts / count(*)
from delivery, imme
group by customer_id

뭔가 또 with 구문으로 시도해보려다가 실패..

select round(avg(order_date=customer_pref_delivery_date)*100, 2) as immediate_percentage
from delivery
where (customer_id, order_date) in (
    select customer_id, min(order_date)
    from delivery
    group by customer_id
)

당연히 group by를 하고 count(*) 로 나눠줘야 한다고 생각했는데, avg로 풀 수 있다는 획기적인 발상.. where 절에 서브쿼리해주는 것도 오랜만인데, 다음에 다시 꼭 풀어봐야겠다

오늘 태블로 과제 엄청 빨리 제출했고 adsp 강의를 못들어서 마저 듣고 자야지..

profile
스포츠 광인

2개의 댓글

comment-user-thumbnail
2025년 5월 8일

왜 우울하시죠?ㅠ 당장 스터디룸으로 따라오세요

1개의 답글