-
12/29스파르타/TIL(Today I Learned) 2023. 12. 29. 09:19
조건에 맞는 사용자 정보 조회하기
-- 거래 게시물을 3건 이상 등록 전체 주소는 시, 도로명 주소, 상세 주소가 함께 출력되도록 해주시고, 전화번호의 경우 xxx-xxxx-xxxx 같은 형태로 하이픈 문자열(- SELECT s.user_id, s.nickname, concat(s.city," ",s.street_address1," ",street_address2) "전체주소", concat(left(s.tlno,3),"-",substring(s.tlno,4,4),"-",right(s.tlno,4)) "전화번호" from used_goods_board b inner join used_goods_user s on b.writer_id = s.user_id where s.user_id in (select WRITER_ID from used_goods_board group by 1 having count(1) >= 3) group by 1 order by 1 desc
어제 튜터님이 말하신대로 having절을 최소화하기 위해 where절을 자세히 쓰는 연습을 하는 중이다.
https://school.programmers.co.kr/learn/courses/30/lessons/164670
자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기
CAR_RENTAL_COMPANY_RENTAL_HISTORY
테이블에서 2022년 10월 16일에 대여 중인 자동차인 경우 '대여중' 이라고 표시하고, 대여 중이지 않은 자동차인 경우 '대여 가능'을 표시하는 컬럼(컬럼명: AVAILABILITY)을 추가하여 자동차 ID와 AVAILABILITY 리스트를 출력하는 SQL문을 작성해주세요. 이때 반납 날짜가 2022년 10월 16일인 경우에도 '대여중'으로 표시해주시고 결과는 자동차 ID를 기준으로 내림차순 정렬해주세요.SELECT car_id case when date(start_date) <= '2022-10-16' and date(end_date) >= '2022-10-16' then "대여중" else "대여 가능" end as AVAILABILITY from CAR_RENTAL_COMPANY_RENTAL_HISTORY group by car_id order by car_id desc
내가 처음에 짠 코드는 위에 코드이다.
내 생각으로는 문제의 조건을 다 맞춘기분이 들었다.
하지만 답이 아니였다. 나는 무엇이 문제인지를 잘 몰라가지고 여러가지 찾아보았다.
-- 코드를 입력하세요 SELECT car_id,max(start_date),max(end_date), max(case when date(start_date) <= '2022-10-16' and date(end_date) >= '2022-10-16' then "대여중" else "대여 가능" end) as AVAILABILITY from CAR_RENTAL_COMPANY_RENTAL_HISTORY group by car_id order by car_id desc
첫번째 내가 짠 코드는 group by에 특징에 의해 오류가 발생할 수 있다.
group by는 집계함수를 사용하지 않는 컬럼이 있으면 그 컬럼은 group by에 포함이 되어야 한다.
하지만 내가 짠 코드는 그렇지 않게 짜였다.
max를 사용한 이유도 그와 같은 이유다. 또한 날짜에 max를 사용해서 가장 최근에 빌리고 반납한 날짜를 비교하여
답을 구한다.