rubus0304 님의 블로그

[데이터분석] 코드카타 (Lv. 5~) 본문

Data Analyst/daily

[데이터분석] 코드카타 (Lv. 5~)

rubus0304 2024. 10. 16. 08:33

69. 대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기  (답 이상한 거 같음   record 5이상이여야하는거 아님-_-???)

CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 대여 시작일을 기준으로 2022년 8월부터 2022년 10월까지 총 대여 횟수가 5회 이상인 자동차들에 대해서 해당 기간 동안의 월별 자동차 ID 별 총 대여 횟수(컬럼명: RECORDS) 리스트를 출력하는 SQL문을 작성해주세요. 결과는 월을 기준으로 오름차순 정렬하고, 월이 같다면 자동차 ID를 기준으로 내림차순 정렬해주세요. 특정 월의 총 대여 횟수가 0인 경우에는 결과에서 제외해주세요.

 

select month,
          car_id,
          records
from
(SELECT month(start_date) 'month', car_id, count(car_id) 'records'
from car_rental_company_rental_history
where start_date >= "2022-08-01" and end_date < "2022-11-01"
group by 1, 2
having records >= 5) a
group by 1, 2
having records > 0
order by 1, 2 desc

 

 

(정답)

SELECT month(start_date) 'month', 
               car_id, 
               count(history_id) 'records'
from CAR_RENTAL_COMPANY_RENTAL_HISTORY
where start_date>="2022-08-01" and start_date<"2022-11-01" and car_id in 
(select car_id 
 from CAR_RENTAL_COMPANY_RENTAL_HISTORY 
 where start_date>="2022-08-01" and start_date<"2022-11-01" 
 group by car_id 
 having count(history_id)>4) 
group by 1, 2
having records >0
order by 1, 2 desc

 

???????

 

 

70. 그룹별 조건에 맞는 식당  목록 출력하기

MEMBER_PROFILE와 REST_REVIEW 테이블에서 리뷰를 가장 많이 작성한 회원의 리뷰들을 조회하는 SQL문을 작성해주세요. 회원 이름, 리뷰 텍스트, 리뷰 작성일이 출력되도록 작성해주시고, 결과는 리뷰 작성일을 기준으로 오름차순, 리뷰 작성일이 같다면 리뷰 텍스트를 기준으로 오름차순 정렬해주세요.

 

(오답)

SELECT a.member_name,
       b.review_text,
       b.review_date,
       b.review_id,
       max(count(b.review_id))
from member_profile a join rest_review b on a.member_id=b.member_id
group by 1,2,3
order by b.review_date, b.review_text 

 

(정답)

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 b.member_id = (select member_id
                    from rest_review
                    group by 1
                    order by count(member_id) desc
                    limit 1)
order by b.review_date, b.review_text 

 

** review_id로 서브쿼리 안 하는 이유는 Join 으로 연결된 id 가 member_id 므로 공통으로 다 들어가는 값이 들어가야함!!

 

 

71. 오프라인/온라인 판매 데이터 통합하기

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)='03'
union
select date_format(sales_date, '%Y-%m-%d') 'sales date',
       product_id,
       Null as user_id,  --->  offline 테이블에 user_id 컬럼이 없으므로 NULL 값으로 채운다.
       sales_amount
from offline_sale
where month(sales_date)='03'
order by 1,2,3

 

 

 

72. 조건에 부합하는 중고거래 댓글 조회하기

USED_GOODS_BOARD와 USED_GOODS_REPLY 테이블에서 2022년 10월에 작성된 게시글 제목, 게시글 ID, 댓글 ID, 댓글 작성자 ID, 댓글 내용, 댓글 작성일을 조회하는 SQL문을 작성해주세요. 결과는 댓글 작성일을 기준으로 오름차순 정렬해주시고, 댓글 작성일이 같다면 게시글 제목을 기준으로 오름차순 정렬해주세요.

 

(오답)  왜 틀린건지 모르겠음 ..질문!!

SELECT a.title,
       a.board_id,
       b.reply_id,
       b.writer_id,
       b.contents,
       date_format(b.created_date,'%Y-%m-%d') 'created_date'
from used_goods_board a join used_goods_reply b on a.board_id = b.board_id
where b.created_date like '2022-10%'
order by 6, 1

 

 

(정답)

SELECT  A.TITLE
        , A.BOARD_ID
        , B.REPLY_ID
        , B.WRITER_ID
        , B.CONTENTS
        , DATE_FORMAT(B.CREATED_DATE, '%Y-%m-%d') AS CRAETED_DATE
  FROM  USED_GOODS_BOARD AS A
 INNER
  JOIN  USED_GOODS_REPLY AS B
    ON  A.BOARD_ID = B.BOARD_ID
 WHERE  SUBSTR(A.CREATED_DATE,1,7) = '2022-10'
 ORDER
    BY  B.CREATED_DATE ASC, A.TITLE ASC;

 

 

 

73. 입양 시각 구하기(2)

보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다. 0시부터 23시까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요. 이때 결과는 시간대 순으로 정렬해야 합니다.

 

(오답 :  테이블에 있는 시간은 7시부터시작..0시부터 나오게 하는 법...??)

SELECT hour(datetime) hour,
       count(datetime) count
from animal_outs
group by 1
order by 1 

 

 

SET 함수..!!!

: 어떤 변수에 특정 값을 할당할 때

 

SET @HOUR = -1;

SELECT (@HOUR := @HOUR +1) 'HOUR'

FROM ANIMAL_OUTS

WHERE @HOUR < 23;

 

 

@HOUR 변수에 -1을 할당한 후 22까지 +1씩 더해준다는 뜻

주의할 점!   SET 사용시 대입 연산자 ' = '  사용  그 외에는 := 를 사용해야함

 

SET @hour = -1;
SELECT (@hour := @hour +1) 'hour',
       (select count(hour(datetime))
        from animal_outs
        where hour(datetime)=@hour) 'count'
FROM ANIMAL_OUTS
WHERE @hour < 23;