-
12/11스파르타/TIL(Today I Learned) 2023. 12. 11. 15:55
1251. Average Selling Price
이 사이트의 문제를 풀 때 영어로 된 문제이다 보니
해석하고 설명 보면서 코딩을 하는데
설명만 보고서 코딩을 하니 오류가 나왔다.
실수를 돌이켜 보면
1. join 조건에서 product_id만 연결한 것이였다.
실제로 주어진 예시의 테이블을 보면 group by 로 묶어도 같은 product_id임에도
구매날짜에 따라 다르게 계산이 되어야한다.
이것을 고려하지 않고 코딩을 하여 첫번째 문제가 생겼다.
join 조건에 u.purchase_date between p.start_date and p.end_date 를 추가하여
해결하였다.
2. 바로 ifnull을 생각치도 못했다.
일단 예시를 보면 생각 할 일이 없었기 때문이다.
하지만 실무를 하다보면 구매를 안할 수 도 있기 때문에
test를 통과 못한것이다.
주어진 평균 구매가격를 구할 때
ifnull을 추가하여 만일 구매를 안한 고객이 있으면 0을 출력하도록 한다.
ifnull(round(sum(p.price*u.units)/sum(u.units),2),0)average_pricehttps://leetcode.com/problems/average-selling-price/description/
문제 : 1211. Queries Quality and Percentage
poor_query_percentage를 구하는 과정에서
count를 써서 select 문에
서브쿼리를 사용해서 구하려고 했다.
하지만 더 쉬운 풀이가 존재했다.
우리는rating이 3점 미만인 갯수를 구하기 위해서
count를 사용하려 했지만
if문을 사용하여 쉽게 구할 수 있었다.
if(rating <3,1,0)을 보면rating이 3점 미만이면 1을 반환하고 그렇지 않으면 0을 반환한다.
즉 우리가 구하려는 3점 미만의 갯수를 구하기 위해서는
sum으로 감싸면 count를 한 것과 같은 효과를
가지며 더욱 간단한 코드가 된다.
select query_name, round(avg(rating/position),2) quality ,round(sum(if(rating <3,1,0)) *100 /count(*),2) poor_query_percentage from queries where query_name is not null group by query_name
https://leetcode.com/problems/queries-quality-and-percentage/description/
1193. Monthly Transactions I
table을 보면 state이 enum이라서
아! 저번에 배운 재귀함수마냥 테이블을
불러서 두개의 조건에 따라서 하면 되겠다!
라고 해서 코딩을 하던 중 계속 막혀서
결국 해설을 찾아 보았다.
해설에서는 두가지 방법이 있는데두가지 방법 모두 맥락은 비슷했다.
# 첫번째 방법 case when 이용 , substr사용 SELECT SUBSTR(trans_date,1,7) as month, country, count(id) 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
case when과 substr로
state 별 갯수를 더하고
amount를 구하는 방법이다
#두번째 방법 date_format과 if를 사용한 방법 SELECT DATE_FORMAT(trans_date, '%Y-%m') AS month, country, COUNT(*) AS trans_count, SUM(IF(state = 'approved', 1, 0)) AS approved_count, SUM(amount) AS trans_total_amount, SUM(IF(state = 'approved', amount, 0)) AS approved_total_amount FROM Transactions GROUP BY DATE_FORMAT(trans_date, '%Y-%m'), country;