본문 바로가기
카테고리 없음

[문제풀이] Leet code - easy3

by kime2 2024. 8. 16.

문제1

출처 : Reformat Department Table - LeetCode

 

 

Dapartmet 테이블을 피펏테이블로 만드는 것

풀이(MYSQL)

select id,
sum(if(month = 'Jan', revenue, null)) as 'Jan_Revenue',
sum(if(month = 'Feb', revenue, null)) as 'Feb_Revenue',
sum(if(month = 'Mar', revenue, null)) as 'Mar_Revenue',
sum(if(month = 'Apr', revenue, null)) as 'Apr_Revenue',
sum(if(month = 'May', revenue, null)) as 'May_Revenue',
sum(if(month = 'Jun', revenue, null)) as 'Jun_Revenue',
sum(if(month = 'Jul', revenue, null)) as 'Jul_Revenue',
sum(if(month = 'Aug', revenue, null)) as 'Aug_Revenue',
sum(if(month = 'Sep', revenue, null)) as 'Sep_Revenue',
sum(if(month = 'Oct', revenue, null)) as 'Oct_Revenue',
sum(if(month = 'Nov', revenue, null)) as 'Nov_Revenue',
sum(if(month = 'Dec', revenue, null)) as 'Dec_Revenue'
from Department
group by id
order by id;

 

문제2

출처 : Queries Quality and Percentage - LeetCode

 

 



 

query_name별 position / rating을 구하고 전체 result개수에서 rating이 3미만의 비율을 구하라

(MYSQL)

-- 정답1.
with base as (
    select  query_name, count(*) as cnt
    from Queries
    where rating< 3
    group by query_name
)
select query_name 
, ifnull(round(avg(rating/position),2),0) as ' quality'
, ifnull(round((select cnt from base where base.query_name = Queries.query_name) / count(*)*100,2),0) as 'poor_query_percentage'
from Queries
where query_name is not null
group by query_name

 

  • base테이블 : query_name별 rating이 3개 미만의 개수를 집계
  • select cnt from base where base.query_name = Queries.query_name : where절을 통해 메인쿼리의 그룹화된 컬럼과 서브쿼리를 매칭해준다 (where base.query_name = Queries.query_name)를 작성하지 않으면 select절에 사용된 서브쿼리가 1개를 초과한 행수를 조회하므로 오류가 발생한다
  • 하단의 오류로 인해 각 계산에 null값을 0으로 대체해주고, query_name이 없는 경우를 제외한다

 

[ 오답 모음 ]

 rating이 3개 미만의 개수가 없을 경우 query_name의 이름이 누락된 경우

 

-- 정답2.
SELECT 
   query_name, ROUND(AVG(rating/position), 2) AS quality,
   ROUND(
     SUM(IF(rating < 3, 1, 0))/COUNT(rating)*100,2) AS poor_query_percentage
FROM Queries
WHERE query_name IS NOT NULL
GROUP BY query_name;

 

  1. query_name이 null이 아닌 경우 필터링 하여
  2. query_name을 기준으로 그룹화 하는데
  3. rating/position의 평균을 집계하고
  4. rating이 3보다 작을때 1, 아니면 0을 대입하여 전체 rating의 수로 나눈경우의 합을 구하라