코딩테스트/SQL

[SQL][CASE-WHEN][DATE_FORMAT][JOIN][IN][GROUP BY] SQL 문제 풀이 모음

박소민 2024. 8. 3. 00:37
  • SQL 문제 풀이 모음

 

  • 조건별로 분류하여 주문상태 출력
FOOD_ORDER 테이블에서 2022년 5월 1일을 기준으로 주문 ID, 제품 ID, 출고일자, 출고여부를 조회하는 SQL문을 작성해주세요. 출고여부는 2022년 5월 1일까지 출고완료로 이 후 날짜는 출고 대기로 미정이면 출고미정으로 출력해주시고, 결과는 주문 ID를 기준으로 오름차순 정렬해주세요.
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 IS NULL THEN '출고미정'
    ELSE '출고대기' END AS '출고여부'
FROM FOOD_ORDER
ORDER BY ORDER_ID

 

 

  • 대여 기록이 존재하는 자동차 리스트 구하기
    • A<= X < B 를 표현할때 한번에 안되고 따로 나눠서  AND 로 엮어야함
    • A<= X  and   X < B
SELECT DISTINCT C.CAR_ID
FROM CAR_RENTAL_COMPANY_CAR AS C
JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY AS H 
ON C.CAR_ID = H.CAR_ID 
WHERE CAR_TYPE='세단'
AND ('2022-10-01'<=START_DATE AND START_DATE <'2022-11-01')
ORDER BY CAR_ID DESC

 

    • 즐겨찾기가 가장 많은 식당 정보 출력하기
      • GROUP BY로 묶으면 가장 상단에 있는 데이터들을 임의로 가져온다
        • GROUP BY FOOD_TYPE으로 묶으면 한식의 맨 첫번째, 일식의 맨 첫번째 ... 를 가져옴
          (즐겨찾기 수가 가장 많은 식당의 정보가 아닌 테이블에서 가장 상단의 식당 정보를 가져오는 것)
        • 고로 SELECT에 MAX(기준) 를 해서 기준별 가장 큰값을 가져오도록 수정  
      • WHERE 과 HAVING에 둘다 적용할수 있는 조건이라면 WHERE절에 사용하는게 바람직합
        • HAVING 은 GROUP BY를 통해 그룹핑 후에 그 그룹에 사용하는 조건절
        • -> 각 그룹에 조건을 거는 방식이기 떄문에 리소스를 더 먹게 됨
SELECT FOOD_TYPE, REST_ID, REST_NAME, FAVORITES
FROM REST_INFO
WHERE FAVORITES IN (SELECT MAX(FAVORITES)
                    FROM REST_INFO
                    GROUP BY FOOD_TYPE)
GROUP BY FOOD_TYPE
ORDER BY FOOD_TYPE DESC
#다른 정답 풀이
SELECT FOOD_TYPE, REST_ID, REST_NAME, FAVORITES
FROM REST_INFO
WHERE (FOOD_TYPE, FAVORITES) IN (SELECT FOOD_TYPE, MAX(FAVORITES)
                                FROM REST_INFO
                                GROUP BY FOOD_TYPE)
GROUP BY FOOD_TYPE
ORDER BY FOOD_TYPE DESC

-----------
# 오답 풀이

아래와 같이 하게 되면 
FOOD_TYPE별로 그룹화되며, 그룹화된 데이터 중 FAVORITES의 최대값을 가져오지만
포함되지 않은 REST_ID와 REST_NAME에 대해 명시적인 처리를 하지 않기 때문에
쿼리의 의미가 불명확해져 에러가 발생되거나 
선택한 REST_ID와 REST_NAME의 임의의 값을 반환하게 됨

SELECT FOOD_TYPE, REST_ID, REST_NAME, MAX(FAVORITES) AS FAVORITES
FROM REST_INFO
GROUP BY FOOD_TYPE
ORDER BY FOOD_TYPE DESC

# 해결 방법
 SQL 표준에 따르면 GROUP BY 절에 포함되지 않은 열(여기서는 REST_ID와 REST_NAME)을
 SELECT에 포함시키려면 그 열이 GROUP BY 절에 포함되거나, 집계 함수의 인자로 들어가야 함