LITTLE BY LITTLE

[1] 프로그래머스 - SQL 본문

프로그래머스

[1] 프로그래머스 - SQL

위나 2024. 8. 8. 21:43

Q1.

대장균들의 자식 수 구하기

# Self Join
https://school.programmers.co.kr/learn/courses/30/lessons/299305

 

프로그래머스

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

programmers.co.kr

 
Q.
대장균 개체의 ID(ID)와 자식의 수(CHILD_COUNT)를 출력하는 SQL 문을 작성해주세요. 자식이 없다면 자식의 수는 0으로 출력해주세요. 이때 결과는 개체의 ID 에 대해 오름차순 정렬해주세요.

 
→ 문제가 헷갈리지만, 자식(ID) 기준으로 같은 부모를 가진 개체가 몇명인지 (사람으로 치면 형제가 몇명인지..) 구하는 것

1. 자식(ID) 기준으로 부모(Parent ID)가 나와있는 형태이기에 부모(Parent ID) 기준 자식(ID)이 보여지도록 변경 필요
2. 자식(ID) 기준으로 부모가 같은 자식 수(=형제) 구하기

 PARENT_ID 기준으로 자식의 수를 구해야하므로,
SELF JOIN을 활용해서 현재 ID기준 PARENT_ID → PARENT_ID 기준 ID 출력하기 

SELECT *
FROM ECOLI_DATA A
LEFT JOIN ECOLI_DATA B ON A.ID = B.PARENT_ID

 
  A.ID와 PARENT_ID로 SELF JOIN하되, 문제에서 자식이 없어도 출력하라고 되어있었기에 LEFT JOIN (ID기준) 해주기

기존 ID기준 부모 ID

셀프 조인 후 PARENT_ID 기준 ID
 
 ID는 1~6 모두 존재했지만, PARNET_ID는 1,2,4으로 3개이기에 부모 기준이니까 나머지에 해당하는(부모가 없는) ID는 null로 나옴
 
2. 최종 쿼리

SELECT DISTINCT A.ID, COUNT(DISTINCT B.ID) AS CHILD_COUNT
FROM ECOLI_DATA A
LEFT JOIN ECOLI_DATA B ON A.ID = B.PARENT_ID
GROUP BY A.ID;


✅ 셀프 조인 예제
customer_id를 기준으로 작성된 테이블에서, customer_id에 매핑된 spouse_id 배우자의 성과 이름을 보고자 한다.

원본 테이블

셀프 조인한 테이블
 
→ id=1인 John의 spouse인 id=2 Mary의 이름도 나온 모습

SELECT
 cust.customer_id,
 cust.firstname,
 cust.lastname,
 cust.birthdate,
 cust.spouse_id,
 spouse.firstname AS spouse_firstname,
 spouse_lastname AS spouse_lastname
FROM customer AS cust
INNER JOIN customer AS spouse
   ON cust.spouse_id = spouse.customer_id

Q2.

재구매가 일어난 상품과 회원 리스트 구하기 
# WHERE과 HAVING 차이 인지
 
※ 참고

 

ONLINE_SALE 테이블에서 동일한 회원이 동일한 상품을 재구매한 데이터를 구하여, 재구매한 회원 ID와 재구매한 상품 ID를 출력하는 SQL문을 작성해주세요. 결과는 회원 ID를 기준으로 오름차순 정렬해주시고 회원 ID가 같다면 상품 ID를 기준으로 내림차순 정렬해주세요.

-- 재구매의 정의: CNT>1
SELECT user_id, product_id
FROM ONLINE_SALE
GROUP BY user_id, product_id
HAVING COUNT(online_sale_id)>1
ORDER BY user_id ASC, product_id DESC


Comments