본문 바로가기
SQL

프로그래머스 sql 문제 풀이하면서 배운 점(1)

by 순원이 2024. 2. 8.

 

문제1

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

SELECT USER_ID, PRODUCT_ID
FROM (
    SELECT USER_ID, PRODUCT_ID, COUNT(*) AS purchase_count
    FROM ONLINE_SALE
    GROUP BY USER_ID, PRODUCT_ID
    HAVING COUNT(*) > 1
) AS repeat_sales
ORDER BY USER_ID ASC, PRODUCT_ID DESC;

 

배운점

테이블에 판단할 속성이 없으므로 테이블 재구성.

 

동일한 동일한 사움 재구매 -> FROM 절 안에 GRUP BY 로 유저, 상품 묶은 후 구매 횟수로 나누기  


문제2

ONLINE_SALE 테이블과 OFFLINE_SALE 테이블에서 2022년 3월의 오프라인/온라인 상품 판매 데이터의 판매 날짜, 상품ID, 유저ID, 판매량을 출력하는 SQL문을 작성해주세요. OFFLINE_SALE 테이블의 판매 데이터의 USER_ID 값은 NULL 로 표시해주세요. 결과는 판매일을 기준으로 오름차순 정렬해주시고 판매일이 같다면 상품 ID를 기준으로 오름차순, 상품ID까지 같다면 유저 ID를 기준으로 오름차순 정렬해주세요.

 

SELECT 
DATE_FORMAT(SALES_DATE,"%Y-%m-%d") AS SALES_DATE,
PRODUCT_ID,
USER_ID,
SALES_AMOUNT
FROM ONLINE_SALE
WHERE DATE_FORMAT(SALES_DATE,"%Y-%m-%d") LIKE "2022-03%"

UNION ALL

SELECT 
DATE_FORMAT(SALES_DATE,"%Y-%m-%d") AS SALES_DATE,
PRODUCT_ID,
NULL AS USER_ID,
SALES_AMOUNT
FROM OFFLINE_SALE
WHERE DATE_FORMAT(SALES_DATE,"%Y-%m-%d") LIKE "2022-03%"

ORDER BY SALES_DATE,PRODUCT_ID,USER_ID

 

배운점

  1. DATE type 다룰 때 부등호 말고 BETWEEN 연산자 다루기.
  2. 테이블 합칠 때 -> UNION ALL
  3. mysql 기본 정렬 ASC
  4. DATE_FORMAT(속성이름, "%Y-%m-%d")

 


문제3

MEMBER_PROFILE 테이블에서 생일이 3월인 여성 회원의 ID, 이름, 성별, 생년월일을 조회하는 SQL문을 작성해주세요. 이때 전화번호가 NULL인 경우는 출력대상에서 제외시켜 주시고, 결과는 회원ID를 기준으로 오름차순 정렬해주세요.

 

-- 코드를 입력하세요
SELECT MEMBER_ID, MEMBER_NAME, GENDER, DATE_OF_BIRTH
FROM MEMBER_PROFILE
WHERE GENDER = 'W'
  AND MONTH(DATE_OF_BIRTH) = 3
  AND TLNO IS NOT NULL
ORDER BY MEMBER_ID;

 

배운점

  1. DATE type MONTH YEAR로 표현가능
  2. IS NOT NULL

 


문제4

REST_INFO와 REST_REVIEW 테이블에서 서울에 위치한 식당들의 식당 ID, 식당 이름, 음식 종류, 즐겨찾기수, 주소, 리뷰 평균 점수를 조회하는 SQL문을 작성해주세요. 이때 리뷰 평균점수는 소수점 세 번째 자리에서 반올림 해주시고 결과는 평균점수를 기준으로 내림차순 정렬해주시고, 평균점수가 같다면 즐겨찾기수를 기준으로 내림차순 정렬해주세요.

 

-- 코드를 입력하세요
SELECT MEMBER_ID, MEMBER_NAME, GENDER, DATE_OF_BIRTH
FROM MEMBER_PROFILE
WHERE GENDER = 'W'
  AND MONTH(DATE_OF_BIRTH) = 3
  AND TLNO IS NOT NULL
ORDER BY MEMBER_ID;

 

배운점

    1. round 함수: ROUND 함수를 사용하여 리뷰 점수의 평균을 소수점 두 번째 자리까지 반올림합니다.
    2. GROUP BY 절: 평균을 계산할 속성을 기준으로 묶음

문제5

REST_INFO와 REST_REVIEW 테이블에서 서울에 위치한 식당들의 식당 ID, 식당 이름, 음식 종류, 즐겨찾기수, 주소, 리뷰 평균 점수를 조회하는 SQL문을 작성해주세요. 이때 리뷰 평균점수는 소수점 세 번째 자리에서 반올림 해주시고 결과는 평균점수를 기준으로 내림차순 정렬해주시고, 평균점수가 같다면 즐겨찾기수를 기준으로 내림차순 정렬해주세요.

 

-- 코드를 입력하세요
SELECT MEMBER_ID, MEMBER_NAME, GENDER, DATE_OF_BIRTH
FROM MEMBER_PROFILE
WHERE GENDER = 'W'
  AND MONTH(DATE_OF_BIRTH) = 3
  AND TLNO IS NOT NULL
ORDER BY MEMBER_ID;

 

배운점

    1. round 함수: ROUND 함수를 사용하여 리뷰 점수의 평균을 소수점 두 번째 자리까지 반올림합니다.
    2. GROUP BY 절: 평균을 계산할 속성을 기준으로 묶음

문제6

REST_INFO와 REST_REVIEW 테이블에서 서울에 위치한 식당들의 식당 ID, 식당 이름, 음식 종류, 즐겨찾기수, 주소, 리뷰 평균 점수를 조회하는 SQL문을 작성해주세요. 이때 리뷰 평균점수는 소수점 세 번째 자리에서 반올림 해주시고 결과는 평균점수를 기준으로 내림차순 정렬해주시고, 평균점수가 같다면 즐겨찾기수를 기준으로 내림차순 정렬해주세요.

정답1

WITH julytotal AS (SELECT flavor, SUM(total_order) as total_order
FROM july
GROUP BY flavor)

SELECT f.flavor
FROM first_half f
JOIN julytotal j
ON f.flavor = j.flavor
ORDER BY f.total_order + j.total_order DESC
LIMIT 3

정답2

SELECT J.FLAVOR
FROM (SELECT FLAVOR, SUM(TOTAL_ORDER) AS 'TOTAL' FROM JULY GROUP BY FLAVOR) AS J
JOIN (SELECT FLAVOR, SUM(TOTAL_ORDER) AS 'TOTAL' FROM FIRST_HALF GROUP BY FLAVOR) AS F
ON J.FLAVOR = F.FLAVOR
ORDER BY J.TOTAL + F.TOTAL DESC LIMIT 3;

 

 

배운점

    1. AS 사용법
    2. LIMIT
    3. SUM, AVG 계산함수 쓸 때 GROUP BY

 

 

 

 

 

'SQL' 카테고리의 다른 글

프로그래머스 sql 문제 풀이하면서 배운 점(2)  (1) 2024.02.09