SQL 학습 10일차, Querie Quality and Percentage (CASE WHEN, AVG)
다양성과 방향성

여행으로 재미있게 살고 엑셀로 성장하는 삶

직무강화/SQL

SQL 학습 10일차, Querie Quality and Percentage (CASE WHEN, AVG)

LATI 라티 2024. 8. 29. 09:06
반응형

 

 

후~ 이번 문제는 어떻게든 혼자 풀어볼려고 30분동안 붙잡고 씨름했다.

1. query rating / position의 평균 비율

2. 모든 raiting의 percentage 단, 3보다 작은 것들만

 

처음에는 WHERE rating <3 으로 풀어보려고 했으나 1번에는 rating <3이 아닌

전체 데이터에 대한 평균 비율이기 때문에 테이블을 2개로 나누어야 했다.

 

self join을 위해 queries 테이블을 a와 b로 나누고

1번에 대한 것은 a테이블에 있는 내용을 불러오고

2번에 대한 것은 b테이블에 있는 내용을 불러오기로 했다.

 

LEFT JOIN으로 rating < 3 인 값들만 붙여넣었는데 그렇게 할 경우

NULL값등 이슈가 있다고 하여 CAHT GPT가 열을 불러올 때 CASE문을 써서 해결하는 방법을 알려주었다.

round(sum(case when b.rating < 3 then 1 else 0 end)

 

처음에는 case 구문을 쓰는게 아직 어색해서 어디에 어떻게 써야 하는지 잘 모르겠다.

보니까 sum(avg)와 같이 구문을 같이 쓰는건 계산이 안되어서 그런 세부규칙들과

적재적소에 쿼리를 사용할 수 있도록 이해만 할 수 있다면 금방 할 수 있을 것 같다.

 

그래도 고무적인건 꽤나(?) 복잡하다고 생각하는 것을 풀 수 있었고

그 과정들을 머리로 조금씩이나마 그릴 수 있다는 것이었다.

 

내가 작성한 답
SELECT distinct a.query_name,

 

    round(((avg(a.rating/a.position))),2) as quality,

 

    round((1/count(b.query_name))*100,2) as poor_query_percentage
FROM queries a

 

LEFT JOIN queries b ON a.query_name = b.query_name

 

WHERE b.rating <3
GROUP BY a.query_name

 

GPT가 작성한 답

 

SELECT distinct a.query_name,

 

    round(avg(a.rating/a.position),2) as quality,

 

   round(sum(case when b.rating < 3 then 1 else 0 end)*100.0/count(b.query_name),2) as poor_query_percentage
FROM
    queries a
LEFT JOIN
    queries b ON a.query_name = b.query_name
GROUP BY a.query_name;
반응형