문제 URL : https://solvesql.com/problems/settled-sellers-1/

 

https://solvesql.com/problems/settled-sellers-1/

 

solvesql.com

 

* 문제 저작권으로 인하여 직접 작성한 쿼리문만 첨부

select seller_id, count(DISTINCT order_id) as orders
from olist_order_items_dataset
group by seller_id
having orders >= 100

 

order_id가 같은 경우는 로우 내 모든 값이 같으므로 중복 처리하여 하나의 행으로 간주해야 하기 때문에 DISTINCT를 적용하여 카운팅

 

+여담) COUNT(DISTINCT col)가 COUNT(col)보다 실행 속도가 느림. 중복 제거용 임시 테이블을 생성하여 해당하는 값을 추가하고, 추후 임시 테이블 내 로우를 카운팅하여 값을 반환하는 동작원리때문

문제 URL : https://solvesql.com/problems/olympic-cities/

 

https://solvesql.com/problems/olympic-cities/

 

solvesql.com

 

* 문제 저작권으로 인하여 직접 작성한 쿼리문만 첨부

select year, upper(substring(city,0,4)) as city
from games
where year > 1999
order by year desc

 

substring(자를 문자열, startIdx, endIdx) - startIdx부터 endIdx 직전까지(포함X) 문자열을 잘라 반환

upper(문자열) - 문자열 내 문자를 모두 대문자로 변환하여 반환

문제 URL : https://solvesql.com/problems/summary-of-artworks-in-3-years/

 

https://solvesql.com/problems/summary-of-artworks-in-3-years/

 

solvesql.com

 

* 문제 저작권으로 인하여 직접 작성한 쿼리문만 첨부

select classification,
sum(case when strftime('%Y', acquisition_date) = '2014' then 1 else 0 end) as '2014',
sum(case when strftime('%Y', acquisition_date) = '2015' then 1 else 0 end) as '2015',
sum(case when strftime('%Y', acquisition_date) = '2016' then 1 else 0 end) as '2016'
from artworks
group by classification
order by classification

 

문제를 풀면서 2014, 2015, 2016 컬럼을 구하는 계산이 각각 다른데, 이 부분을 어떻게 하나의 테이블 안에 표시할 것인가에 대해 고민했음.

각 컬럼에 대한 값을 구한 별개의 테이블을 만들어서 조인을 해야하나 싶었지만, 그러면 독립된 테이블이 3개여서 쿼리문도 좀 지저분하고 '이게 맞나'싶을 것 같아서 ..

근데 생각해보니까 이미 문제명에 답이 있었음. 집계 함수 쓰면 해결될 것을 ....

 

CASE WHEN 구문은 조건에 따른 값을 활용하여 새로운 열 생성 / 열 집계를 도움 (여기선 열 집계의 역할로 사용)

이것과 집계 함수 SUM을 활용하면 문제 내 필요한 값들을 구할 수 있음

조건에 해당하면 카운팅 +1이 되는 식으로 구현함

문제 URL : https://solvesql.com/problems/max-row/

 

https://solvesql.com/problems/max-row/

 

solvesql.com

 

* 문제 저작권으로 인하여 직접 작성한 쿼리문만 첨부

select id from points
where x == (select max(x) from points)
or y == (select max(y) from points)
order by id

 

조건에서 사용될 각 열의 최댓값을 구하기 위해 서브쿼리 사용

값이 A열과 B열 중 하나에서라도 최댓값과 동일하면 포함시키기 위해 OR 연산자를 사용

+ Recent posts