프로그래머스 MySQL Lv4
- 그룹별 조건에 맞는 식당 목록 출력하기
member_profile 테이블
rest_review 테이블
- 문제
MEMBER_PROFILE와 REST_REVIEW 테이블에서 리뷰를 가장 많이 작성한 회원의 리뷰들을 조회하는 SQL문을 작성해주세요. 회원 이름, 리뷰 텍스트, 리뷰 작성일이 출력되도록 작성해주시고, 결과는 리뷰 작성일을 기준으로 오름차순, 리뷰 작성일이 같다면 리뷰 텍스트를 기준으로 오름차순 정렬해주세요.
- 풀이
SELECT a.member_name, b.review_text, date_format(b.review_date, '%Y-%m-%d') review_date
FROM member_profile a
JOIN rest_review b
ON a.member_id=b.member_id
WHERE a.member_id = (SELECT member_id
FROM rest_review
GROUP BY member_id
ORDER BY count(*) desc limit 1)
ORDER BY 3 , 2
서브 쿼리는 잘 만들어놓고 from에 넣을 생각만 해서 오래 걸림
- 연간 평가점수에 해당하는 평가 등급 및 성과금 조회하기
hr_department 테이블
hr_employees 테이블
hr_grade 테이블
- 문제
HR_DEPARTMENT, HR_EMPLOYEES, HR_GRADE 테이블을 이용해 사원별 성과금 정보를 조회하려합니다. 평가 점수별 등급과 등급에 따른 성과금 정보가 아래와 같을 때, 사번, 성명, 평가 등급, 성과금을 조회하는 SQL문을 작성해주세요.
평가등급의 컬럼명은 GRADE로, 성과금의 컬럼명은 BONUS로 해주세요.
결과는 사번 기준으로 오름차순 정렬해주세요.
- 풀이
SELECT a.emp_no, a.emp_name,
case when avg(b.score) >= 96 then 'S'
when avg(b.score) >= 90 then 'A'
when avg(b.score) >= 80 then 'B'
else 'C' end grade,
case when avg(b.score) >= 96 then a.sal*0.2
when avg(b.score) >= 90 then a.sal*0.15
when avg(b.score) >= 80 then a.sal*0.1
else a.sal*0 end bonus
FROM hr_employees a
JOIN hr_grade b
ON a.emp_no=b.emp_no
GROUP BY a.emp_no
hr_grade에 반기를 생각하지 못하고 평균값을 내지 않아서 결과가 나오지 않았음
- 오프라인/온라인 판매 데이터 통합하기
online_sale 테이블
offline_sale 테이블
- 문제
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') sales_date,
product_id,
user_id,
sales_amount
FROM online_sale
WHERE month(sales_date)=3
UNION
SELECT date_format(sales_date,'%Y-%m-%d') sales_date,
product_id,
null as user_id,
sales_amount
FROM offline_sale
WHERE month(sales_date)=3
ORDER BY 1, 2, 3
- 특정 세대의 대장균 찾기
ecoli_data 테이블
- 문제
3세대의 대장균의 ID(ID) 를 출력하는 SQL 문을 작성해주세요. 이때 결과는 대장균의 ID 에 대해 오름차순 정렬해주세요.
- 풀이
SELECT y.id
FROM (SELECT b.id
FROM ecoli_data a JOIN ecoli_data b ON a.id=b.parent_id
WHERE a.parent_id is null) x
JOIN ecoli_data y ON x.id=y.parent_id
1세대 id가 1,2라서 처음에 where a.id=1 and a.id=2 했다가 테스트만 통과하고 오답뜸
null을 잡아야 하는데 생각 없이 1,2를 넣었다 정신 차려
- 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기
car_rental_company_car 테이블
car_rental_company_rental_history 테이블
car_rental_company_discount_plan 테이블
- 문제
CAR_RENTAL_COMPANY_CAR 테이블과 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블과 CAR_RENTAL_COMPANY_DISCOUNT_PLAN 테이블에서 자동차 종류가 '세단' 또는 'SUV' 인 자동차 중 2022년 11월 1일부터 2022년 11월 30일까지 대여 가능하고 30일간의 대여 금액이 50만원 이상 200만원 미만인 자동차에 대해서 자동차 ID, 자동차 종류, 대여 금액(컬럼명: FEE) 리스트를 출력하는 SQL문을 작성해주세요. 결과는 대여 금액을 기준으로 내림차순 정렬하고, 대여 금액이 같은 경우 자동차 종류를 기준으로 오름차순 정렬, 자동차 종류까지 같은 경우 자동차 ID를 기준으로 내림차순 정렬해주세요.
- 풀이
SELECT a.car_id, a.car_type, round(a.daily_fee*(1-c.discount_rate/100)*30) fee
FROM car_rental_company_car a
JOIN car_rental_company_rental_history b ON a.car_id=b.car_id
JOIN car_rental_company_discount_plan c ON a.car_type=c.car_type
WHERE a.car_id not in (SELECT car_id
FROM car_rental_company_rental_history
WHERE end_date >= '2022-11-01' and start_date <= '2022-11-30') AND c.duration_type like '30%'
GROUP BY a.car_id
HAVING a.car_type in ('세단', 'SUV') and (fee >= 500000 and fee < 2000000)
ORDER BY 3 desc, 2, 1 desc
'2022년 11월 1일부터 2022년 11월 30일까지 대여 가능'이란 조건이 너무 헷갈렸다
탈탈 털림
'데이터분석 > TIL' 카테고리의 다른 글
20240704 TIL (0) | 2024.07.04 |
---|---|
240701 TIL (0) | 2024.07.01 |
240625 TIL (0) | 2024.06.25 |