코딩테스트 준비/SQL문법 7

[프로그래머스 LV4] - 자동차 대여 기록 별 대여 금액 구하기(string, date) SQL(how to use 'with clause' )

문제 https://school.programmers.co.kr/learn/courses/30/lessons/151141 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 접근방법 세 테이블을 한 번에 join 시킨 후 해결하려고 했지만, 실패했다. 특히, 대여기간 별로 할인율을 다르게 적용하는 부분이 어려웠다. case문을 사용해야 할 거 같은데, 어디다가 위치시켜야 할 지 감이 오지 않았다. 그래서 다른 사람 답안을 참고했다. with를 써서 해결한 것을 볼 수 있었다. rental_date_per_history에서 각 기록별 rental_date를 가져..

[프로그래머스 LV3] - 조건에 맞는 사용자 정보 조회하기(string, date) SQL

문제 https://school.programmers.co.kr/learn/courses/30/lessons/164670 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 접근방법 concat과, left, right, substr, coalesce 등의 문자열 조작함수를 활용한다. 코드 -- 코드를 입력하세요 SELECT u.user_Id, u.nickname, concat(u.city,' ', u.street_address1,' ', coalesce(u.street_address2, '')) as 전체주소, concat( left(u.tlno, 3), '..

[프로그래머스 LV5] - 상품을 구매한 회원 비율 구하기(join) SQL

문제 https://school.programmers.co.kr/learn/courses/30/lessons/131534 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 접근방법 LV5라고 적혀있어서 쫄았는데, 풀만했다. 코드 -- 코드를 입력하세요 SELECT year(sales_date) as year, month(sales_date) as month, count(distinct user_id) as purchased_users, round(count(distinct user_id) / (select count(distinct user_id) from ..

[프로그래머스 LV4] - 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기(join) SQL

문제 https://school.programmers.co.kr/learn/courses/30/lessons/157339#qna 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 접근방법 복잡한 문제였다. 여태 푼 sql문제 중 가장 오래걸렸다. 처음 접근 할 때, natural join을 이용해서 풀려고 해봤는데, 잘 안 됐다. 또 discount_rate이 문자열 데이터인 줄 착각해서 좀 헤메기도 했다. 문제를 다시보니 정수 데이터였다. 다음부턴 문제를 잘 봐야겠다. 그래서 다른 사람 풀이를 참고했다. from 문에서 join하기 전에 subquery를 ..

[프로그래머스] - 자동차 대여 기록에서 장기/단기 대여 구분하기 SQL - String, Date

문제 https://school.programmers.co.kr/learn/courses/30/lessons/151138 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 접근방법 코드 SELECT history_id, car_id, date_format(start_date, '%Y-%m-%d') as start_date, date_format(end_date, '%Y-%m-%d') as end_date, case when datediff(end_date, start_date) >= 29 then '장기 대여' else '단기 대여' end as rent_t..

[프로그래머스] - 대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기 (group by) SQL

문제 https://school.programmers.co.kr/learn/courses/30/lessons/151139 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 접근방법 쉽게 설명하면, 8월부터 10월까지 대여횟수가 5회 이상인 자동차들에 대해서 해당 기간 동안 월별 대여횟수를 출력하는 문제다. 처음에 문제를 보고 헷갈렸지만, 일단 8월부터 10월까지 총 대여횟수가 5회 이상인 자동차들의 id를 알면, 그 id의 자동차가 월별로 몇 번 대여됐는 지를 탐색하면 된다. 따라서 where안에 subquery를 넣어 car_id가 8-10월 사이 총 대여..

[프로그래머스] - 자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기(group by) SQL

문제 https://school.programmers.co.kr/learn/courses/30/lessons/157340 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 접근방법 어려워서 gpt와 gemini에게 물어봤다. gemini 코드가 좀 더 다양한 케이스에 적용 가능해 보인다. 코드 (from gemini) SELECT car_id, CASE WHEN EXISTS ( SELECT * FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY h2 WHERE h2.car_id = h.car_id AND h2.start_date = '202..