문제 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 연산자를 사용

문제 링크 - https://school.programmers.co.kr/learn/courses/30/lessons/131533

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


 

문제 설명

판매중인 상품 정보(ID, 상품코드, 가격)를 담은 PRODUCT 테이블과 오프라인 판매 정보를 담은 OFFLINE_SALE 테이블이 주어짐

그 중 상품 코드 당 총 판매금액 (판매한 개수*판매액)을 출력 

(총 판매금액을 기준으로 내림차순 정렬, 같다면 상품코드를 기준으로 오름차순 정렬)

 

풀이법 구상

ID값을 기준으로 Join을 이용하여 PRODUCT 테이블 내 가격정보와 OFFLINE_SALE 테이블 내 판매량 정보를 곱한 SALES 열 생성

 

코드 구현 (MySQL 사용)

SELECT PRODUCT_CODE, SUM(PRICE*SALES_AMOUNT) AS SALES
    FROM PRODUCT JOIN OFFLINE_SALE
    ON PRODUCT.PRODUCT_ID = OFFLINE_SALE.PRODUCT_ID
    GROUP BY PRODUCT_CODE
    ORDER BY SALES DESC, PRODUCT_CODE ASC

 

+) 삽질

처음에 이렇게 작성했다가 중복 행이 있는 줄 알고 DISTINCT 썼는데 틀렸음

 

혹시나하고 OFFLINE_SALE_ID 같이 출력해봤더니 중복행이 아니었음

-> 각각 다른 판매건수이므로 상품코드별로 다 합쳐야 총 판매금액을 구할 수 있어서 GROUP BY 사용

+ Recent posts