SQL/SQL 문제풀이 스터디

[2주차] 프로그래머스, SELECT/ SUM,MIN,MAX 문제풀이

dundunee 2022. 11. 11. 22:35

 

문제1. 프로그래머스 > SELECT > 오프라인/온라인 판매 데이터 통합하기: UNION ALL
# 정답으로 인정됨
SELECT DB.SALES_DATE AS SALES_DATE,
       DB.PRODUCT_ID AS PRODUCT_ID,
       CASE WHEN DB.USER_ID IS NULL THEN NULL
       ELSE DB.USER_ID
       END AS USER_ID,
       DB.SALES_AMOUNT AS SALES_AMOUNT
FROM(
SELECT DATE_FORMAT(SALES_DATE, "%Y-%m-%d") as SALES_DATE,
       PRODUCT_ID,
       USER_ID,
       SUM(SALES_AMOUNT) AS SALES_AMOUNT
FROM ONLINE_SALE
WHERE MONTH(SALES_DATE) = 3
GROUP BY 1, 2, 3
UNION ALL
SELECT DATE_FORMAT(SALES_DATE, "%Y-%m-%d") as SALES_DATE,
       PRODUCT_ID,
       NULL AS USER_ID,
       SUM(SALES_AMOUNT) AS SALES_AMOUNT
FROM OFFLINE_SALE
WHERE MONTH(SALES_DATE) = 3
GROUP BY 1, 2, 3
) DB 
ORDER BY 1, 2, 3
# 정답으로 인정되지 않음?
SELECT DB.SALES_DATE AS SALES_DATE,
       DB.PRODUCT_ID AS PRODUCT_ID,
       CASE WHEN DB.USER_ID IS NULL THEN "NULL"
       ELSE DB.USER_ID
       END AS USER_ID,
       DB.SALES_AMOUNT AS SALES_AMOUNT
FROM(
SELECT DATE_FORMAT(SALES_DATE, "%Y-%m-%d") as SALES_DATE,
       PRODUCT_ID,
       USER_ID,
       SUM(SALES_AMOUNT) AS SALES_AMOUNT
FROM ONLINE_SALE
WHERE MONTH(SALES_DATE) = 3
GROUP BY 1, 2, 3
UNION ALL
SELECT DATE_FORMAT(SALES_DATE, "%Y-%m-%d") as SALES_DATE,
       PRODUCT_ID,
       NULL AS USER_ID,
       SUM(SALES_AMOUNT) AS SALES_AMOUNT
FROM OFFLINE_SALE
WHERE MONTH(SALES_DATE) = 3
GROUP BY 1, 2, 3
) DB 
ORDER BY 1, 2, 3

  • 문제에서 USER_ID가 NULL인경우 NULL로 표시하라 했으나, 표시를 한 경우 정답값이 똑같이 나와도 정답으로 인정되지 않았다.
  • 이 문제는 온라인과 오프라인 모두에서 3월 주문 데이터를 뽑아와야하기에 조인을 쓸 것이 아니라 UNION/UNION ALL을 써야 한다.
  • 즉 두 테이블에서 공통되는 부분 + 공통되지 않은 부분까지 모두 출력하려면 UNION을 써야 한다.

 

문제2. 프로그래머스 > SELECT > 아픈동물찾기: 비교연산자 "="
SELECT ANIMAL_ID,
       NAME
FROM ANIMAL_INS
WHERE INTAKE_CONDITION = "Sick" 
ORDER BY ANIMAL_ID

 

 

문제3. 프로그래머스 > SELECT > 어린동물찾기: 비교연산자 "!="
SELECT ANIMAL_ID,
       NAME
FROM ANIMAL_INS
WHERE INTAKE_CONDITION != "Aged"
ORDER BY 1

 

 

문제4. 프로그래머스 > SELECT > 동물의 아이디와 이름: 정렬
SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
ORDER BY ANIMAL_ID

 

 

문제5. 프로그래머스 > SELECT > 여러 기준으로 정렬하기
SELECT ANIMAL_ID, NAME, DATETIME
FROM ANIMAL_INS
ORDER BY NAME, DATETIME DESC

 

 

문제6. 프로그래머스 > SELECT > 상위n개 레코드: ORDER BY + LIMIT
SELECT NAME
FROM ANIMAL_INS
ORDER BY DATETIME
LIMIT 1

 

 

문제7. 프로그래머스 > SELECT > 조건에 맞는 회원수 구하기: YEAR(), AND, BETWEEN, COUNT()
SELECT COUNT(*)
FROM USER_INFO
WHERE (YEAR(JOINED) = 2021) AND (AGE BETWEEN 20 AND 29)

 

 

문제8. 프로그래머스 > SUM, MIN, MAX > 가장비싼상품구하기: MAX()
SELECT MAX(PRICE) AS MAX_PRICE
FROM PRODUCT

 

 

문제9. 프로그래머스 > SUM, MIN, MAX > 최댓값구하기: MIN()
SELECT MAX(DATETIME) AS 시간
FROM ANIMAL_INS

 

 

문제10. 프로그래머스 > SUM, MIN, MAX > 최솟값구하기: MIN()
SELECT MIN(DATETIME)
FROM ANIMAL_INS

  • 보통 오래된 주문일 및 최근 주문일을 추출할때 MIN(), MAX()를 사용한다.