SQL: 특정 컬럼에 필터링 된 조건이 필요할 때

2024. 10. 14. 02:21전처리/SQL

 

01 첫 번째 문제


문제 URL: Queries Quality and Percentage

 

tip. 전체 결괏값을 나타내는 서브쿼리를 쓰면 안돼, IF문으로 query_name마다의 다른 결괏값을 출력할 수 있어야 한다.

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

다음과 같은 output처럼 Dog과 Cat 각각의 결괏값이 필요하면 IF문을 사용하라.

 

02 두 번째 문제


문제 URL: Monthly Transactions I

 

tip. 위에서 언급한 내용은 다음 연습 문제에서 확실하게 적용해볼 수 있었다.

SELECT
    DATE_FORMAT(trans_date, '%Y-%m') as month,
    country,
    COUNT(*) AS trans_count,
    COUNT(IF(state='approved',1,NULL)) AS approved_count,
    SUM(amount) AS trans_total_amount,
    SUM(IF(state='approved',amount,NULL)) AS approved_total_amount
FROM
    Transactions
GROUP BY
    month, country;

tip. 참고 코드: IF가 아닌 CASE WHEN을 활용한 조건식도 필터링이 간단하다.

SUM(CASE WHEN state = 'approved' THEN 1 ELSE 0 END) approved_count,
SUM(CASE WHEN state = 'approved' THEN amount ELSE 0 END) approved_total_amount