상세 컨텐츠

본문 제목

[SQL] Programmers

데이터 과학

by Taeyoon.Kim.DS 2023. 11. 11. 19:34

본문

SELECT MEMBER_ID, MEMBER_NAME, GENDER, DATE_FORMAT(DATE_OF_BIRTH, '%Y-%m-%d') AS DATE_OF_BIRTH
FROM MEMBER_PROFILE
WHERE MONTH(DATE_OF_BIRTH) = 3
  AND TLNO IS NOT NULL
  AND GENDER = 'W'
ORDER BY MEMBER_ID ASC;

 

MEMBER_PROFILE 테이블에서 성별이 여성이면서, 전화번호가 비어있지 않고, 생일이 3월인 경우, DATE FORMAT을 00:00:00이 추가되지 않도록 지정해주고, 오름차순 ASC로 출력.

SELECT 
    PT_NAME, 
    PT_NO, 
    GEND_CD, 
    AGE, 
    COALESCE(TLNO, 'NONE') AS TLNO
FROM PATIENT
WHERE AGE <= 12
    AND GEND_CD = 'W'
ORDER BY 
    AGE DESC, 
    PT_NAME ASC;

 PATIENT 테이블에서 나이가 12세 이하이면서 여성인 환자의 이름, 번호, 성별, 나이, 연락처를 출력하는데 나이별로 내림차순하고 나이가 같으면 이름으로 오름차순 할 것.

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

GROUP BY USER_ID, PRODUCT_ID: 이 부분은 USER_ID와 PRODUCT_ID에 따라 레코드들을 그룹화합니다. 이는 동일한 사용자가 동일한 제품을 구매했는지를 확인하는 데 필요합니다.
HAVING COUNT(*) > 1: 이 조건은 각 그룹에 속한 레코드의 수가 1개보다 많은 경우, 즉 동일한 USER_ID가 같은 PRODUCT_ID를 2번 이상 구매한 경우만을 필터링합니다.
ORDER BY USER_ID ASC, PRODUCT_ID DESC: 결과는 먼저 USER_ID에 따라 오름차순으로 정렬됩니다. 같은 USER_ID를 가진 레코드의 경우, PRODUCT_ID에 따라 내림차순으로 정렬됩니다.

 

(SELECT DATE_FORMAT(SALES_DATE, '%Y-%m-%d') SALES_DATE, PRODUCT_ID, USER_ID, SALES_AMOUNT
FROM ONLINE_SALE
WHERE SALES_DATE BETWEEN '2022-03-01' AND '2022-03-31')

UNION ALL

(SELECT DATE_FORMAT(SALES_DATE, '%Y-%m-%d') SALES_DATE, PRODUCT_ID, NULL AS USER_ID, SALES_AMOUNT
FROM OFFLINE_SALE
WHERE SALES_DATE BETWEEN '2022-03-01' AND '2022-03-31')

ORDER BY SALES_DATE ASC, PRODUCT_ID ASC, USER_ID ASC;

판매날짜가 2022년 3월인 경우 오프라인과 온라인을 UNION하고 판매 날짜로 오름차순, 제품 아이디로 오름차순, 유저 아이디로 오름차순. DATE_FORMAT을 00:00:00을 지우기 위해 추가. USER_ID는 OFFLINE_SALES에 존재하지 않으므로 NULL로 대체.

 

SELECT 
    ROUND(AVG(DAILY_FEE)) AS AVERAGE_FEE
FROM CAR_RENTAL_COMPANY_CAR
WHERE CAR_TYPE = 'SUV';

 

CAR TYPE이 SUV인 경우에 AVERAGE 평균 요금을 하고 ROUND.

 

SELECT BOOK_ID, DATE_FORMAT(PUBLISHED_DATE, '%Y-%m-%d')
FROM BOOK
WHERE PUBLISHED_DATE BETWEEN '2021-01-01' AND '2021-12-31'
AND CATEGORY = '인문'
ORDER BY PUBLISHED_DATE ASC;

BOOK 테이블에서 published_date가 2021년이면서 category가 '인문'인 데이터를 published_date 오름차순으로 정렬하고 book_id와 plubished_date를 출력.

 

SELECT FIRST_HALF.FLAVOR
FROM FIRST_HALF
INNER JOIN ICECREAM_INFO
ON FIRST_HALF.FLAVOR = ICECREAM_INFO.FLAVOR
WHERE TOTAL_ORDER > 3000
AND INGREDIENT_TYPE = 'fruit_based'
ORDER BY TOTAL_ORDER DESC;

First_half 테이블과 Icecream_info를 inner join하여 두 테이블이 겹쳐지는 부분을 하나의 테이블로 만들어서 전체 order의 갯수가 3000개 이상이면서 ingredient_type이 과일베이스인경우의 전체 오더량을 total_order를 내림차순으로 정렬하기.

SELECT B.TITLE, B.BOARD_ID, R.REPLY_ID, R.WRITER_ID, R.CONTENTS, DATE_FORMAT(R.CREATED_DATE, '%Y-%m-%d')
FROM USED_GOODS_BOARD AS B
INNER JOIN USED_GOODS_REPLY AS R ON B.BOARD_ID = R.BOARD_ID
WHERE B.CREATED_DATE BETWEEN '2022-10-01' AND '2022-10-31'
ORDER BY R.CREATED_DATE ASC, B.TITLE ASC;

 

USED_GOODS_BOARD를 b로 지칭하고, USED_GOODS_REPLY를 r로 지칭한 후에, 두 테이블에서 중복으로 가지고 있는 BOARD_ID를 각각의 JOIN 기점으로 잡아서 INNER JOIN을 통해서 하나의 작은 테이블을 만든다. 그 테이블안에서 USED_GOODS_BOARD에서 2022년 10월에 해당하는 부분만 나타내도록 한다. 두 테이블을 합쳤으나 SUB QUERY를 만든것이 아니기 때문에 원래 존재하던 B 테이블에서 존재하는 컬럼을 사용해주어야 한다.

SELECT RI.FOOD_TYPE, RI.REST_ID, RI.REST_NAME, RI.FAVORITES
FROM REST_INFO RI
JOIN (
    SELECT FOOD_TYPE, MAX(FAVORITES) AS MAX_FAV
    FROM REST_INFO
    GROUP BY FOOD_TYPE
) AS MaxFav
ON RI.FOOD_TYPE = MaxFav.FOOD_TYPE AND RI.FAVORITES = MaxFav.MAX_FAV
ORDER BY RI.FOOD_TYPE DESC;

REST_INFO 테이블에서 FOOD_TYPE을 기준으로 묶어준다. 묶은 후에는 집계함수를 사용해야 하므로 SELECT단에서 MAX(FAVORITES)를 사용할 수 있다. FOOD TYPE별로 묶였기 때문이다. 그리고 나서 그 테이블을 SUB QUERY로 지정하고, 그 테이블과 원래 있던 REST_INFO 더 큰 테이블과 합쳐주는데 원래 있던 테이블 RI의 FOOD_TYPE과 MaxFav의 FOOD_TYPE과 FAVORITES가 각 테이블에서 같은 것을 기준으로 묶어줍니다.

 

관련글 더보기