문제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;
- query_name이 null이 아닌 경우 필터링 하여
- query_name을 기준으로 그룹화 하는데
- rating/position의 평균을 집계하고
- rating이 3보다 작을때 1, 아니면 0을 대입하여 전체 rating의 수로 나눈경우의 합을 구하라