SQL/SQL 문제풀이 스터디

[5주차] 프로그래머스: JOIN, STRING, DATE

dundunee 2022. 12. 8. 16:36

문제1. 프로그래머스 > JOIN > 상품별 온라인 매출 구하기 #JOIN  #집계함수 #GROUPBY

SELECT P.PRODUCT_CODE,
       SUM(O.SALES_AMOUNT) * P.PRICE AS SALES
FROM PRODUCT P
INNER JOIN OFFLINE_SALE O ON P.PRODUCT_ID = O.PRODUCT_ID
GROUP BY 1
ORDER BY 2 DESC, 1

 

문제2. 프로그래머스 > JOIN > 상품을 구매한 회윈 비율 구하기 #날짜함수 #집계함수

SELECT YEAR(OS.SALES_DATE) AS YEAR,
       MONTH(OS.SALES_DATE) AS MONTH,
       COUNT(DISTINCT OS.USER_ID) AS PUCHASED_USERS,
       ROUND((COUNT(DISTINCT OS.USER_ID)) / (SELECT COUNT(DISTINCT USER_ID) FROM USER_INFO WHERE YEAR(JOINED) = 2021), 1) AS PUCHASED_RATIO
FROM USER_INFO UI
INNER JOIN ONLINE_SALE OS ON UI.USER_ID = OS.USER_ID
WHERE YEAR(UI.JOINED) = 2021
GROUP BY 1, 2
ORDER BY 1, 2

SELECT 절에서 연산을 할 때 SELECT절 서브쿼리를 써본적은 처음이다. 서브쿼리로 들어간 절은 전체 회원수를 집계해야하는 것이기 때문에 월 조건이 걸려서는 안되므로 위와 같이 쿼리를 작성하였음을 기억하자.

 

 

문제3. 프로그래머스 > String, Date > 취소되지 않은 진료 예약 조회하기 #JOIN

SELECT A.APNT_NO,
       P.PT_NAME,
       P.PT_NO,
       A.MCDP_CD,
       D.DR_NAME,
       A.APNT_YMD
FROM APPOINTMENT A
INNER JOIN PATIENT P ON A.PT_NO = P.PT_NO
INNER JOIN DOCTOR D ON A.MDDR_ID = D.DR_ID
WHERE DATE_FORMAT(A.APNT_YMD, '%Y-%m-%d') = '2022-04-13' AND A.MCDP_CD = "CS" AND A.APNT_CNCL_YN = "N"
ORDER BY A.APNT_YMD

조인을 할 때는 key를 잘 보자! 

 

 

문제4. 프로그래머스 > String, Date > 조건별로 분류하여 주문상태 출력하기 #CASE WHEN #DATE_FORMAT()

SELECT ORDER_ID, 
       PRODUCT_ID,
       DATE_FORMAT(OUT_DATE, '%Y-%m-%d') as OUT_DATE,
       CASE 
            WHEN OUT_DATE <= '2022-05-01' THEN "출고완료"
            WHEN OUT_DATE > '2022-05-01' THEN "출고대기"
            ELSE "출고미정"
        END AS 출고여부 
FROM FOOD_ORDER
ORDER BY ORDER_ID

새로운 컬럼을 생성해서 조건별로 값을 출력해야 한다면 SELECT절 CASE WHEN문을 기억하자!

 

 

문제5. 프로그래머스 > String, Date > 루시와 엘라 찾기 #문자열 IN

SELECT ANIMAL_ID,
       NAME,
       SEX_UPON_INTAKE
FROM ANIMAL_INS
WHERE NAME IN ('Lucy', 'Ella', 'Pickle', 'Rogan', 'Sabrina', 'Mitty')
ORDER BY ANIMAL_ID

 

 

문제6. 프로그래머스 > String, Date > 이름에 EL 들어가는 동물 찾기 #들어간 문자열 찾기 #LIKE%

SELECT ANIMAL_ID,
       NAME
FROM ANIMAL_INS
WHERE ANIMAL_TYPE = "Dog" and 
      (NAME LIKE '%EL%' OR NAME LIKE '%el%')
ORDER BY NAME

문자열 안에 들어 있는 문자를 찾고 싶다면 컬럼 LIKE '%'를 쓰면 된다. 이따 %는 어떤 것도 봐도 된다는 의미로 

  • LIKE '문자열%': 문자열이 맨 앞에 포함되어있고, 그 뒤에는 어떤 것도 와도 된다
  • LIKE '%문자열%': 문자열이 가운데에 들어가있고, 앞뒤로 아무거나 와도 된다.
  • LIKE '%문자열': 문자열이 뒤에 오고 앞에는 아무거나 와도 된다.

로 기억하면 쉬울것이다!

 

 

문제7. 프로그래머스 > String, Date > 이름에 EL 들어가는 동물 찾기 #CASE WHEN

SELECT ANIMAL_ID,
       NAME,
       CASE
            WHEN SEX_UPON_INTAKE LIKE 'Neutered%' THEN "O"
            WHEN SEX_UPON_INTAKE LIKE 'Spayed%' THEN "O"
            ELSE "X"
        END AS 중성화
FROM ANIMAL_INS
ORDER BY ANIMAL_ID

 

 

 

문제8. 프로그래머스 > String, Date > 오랜기간 보호한 동물(2) #ORDER BY 조건 #LIMIT

SELECT AI.ANIMAL_ID,
       AI.NAME
FROM ANIMAL_INS AI
INNER JOIN ANIMAL_OUTS AO ON AI.ANIMAL_ID = AO.ANIMAL_ID
GROUP BY AI.ANIMAL_ID
ORDER BY (AO.DATETIME - AI.DATETIME) DESC
LIMIT 2

날짜 계산이다. 보호기간이 가장 오래된 동물을 찾는 것이므로 ORDER BY절에 조건을 두면 된다.

 

 

문제9. 프로그래머스 > String, Date > DATETIME에서 DATE로 형 변환 #DATE_FORMAT()

SELECT ANIMAL_ID,
       NAME,
       DATE_FORMAT(DATETIME, '%Y-%m-%d') AS 날짜
FROM ANIMAL_INS
ORDER BY ANIMAL_ID

 

문제10. 프로그래머스 > String, Date > 카테고리 별 상품개수 구하기 #LEFT #집계함수

SELECT LEFT(PRODUCT_CODE, 2) AS CATEGORY,
       COUNT(PRODUCT_ID) AS PRODUCTS
FROM PRODUCT
GROUP BY CATEGORY
ORDER BY CATEGORY