티스토리 뷰

SQL 코드카타

Q46. 대여 기록이 존재하는 자동차 리스트 구하기

1. 문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/157341

2. 정답 코드:

SELECT
    DISTINCT(c.CAR_ID) AS CAR_ID
FROM CAR_RENTAL_COMPANY_CAR AS c
JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY AS r
  ON c.CAR_ID = r.CAR_ID
  AND c.CAR_TYPE = '세단'
  AND SUBSTR(r.START_DATE, 6, 2) = '10'
ORDER BY c.CAR_ID DESC;

 

Q47. 모든 레코드 조회하기

1. 문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/59034

2. 정답 코드:

SELECT *
FROM ANIMAL_INS
ORDER BY ANIMAL_ID;

 

Q48. 즐겨찾기가 가장 많은 식당 정보 출력하기

1. 문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/131123

2. 정답 코드:

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
)
ORDER BY FOOD_TYPE DESC;

# 서브쿼리 사용 + IN 조건 2가지 주기

SELECT
    FOOD_TYPE,
    REST_ID,
    REST_NAME,
    FAVORITES
FROM (
    SELECT
        *,
        RANK() OVER (
            PARTITION BY FOOD_TYPE
            ORDER BY FAVORITES DESC
        ) AS rnk
    FROM REST_INFO
) AS t
WHERE rnk = 1 
ORDER BY FOOD_TYPE DESC;

# 윈도우 함수 사용 + RANK 함수 사용

SELECT
    FOOD_TYPE,
    REST_ID,
    REST_NAME,
    FAVORITES
FROM REST_INFO
GROUP BY FOOD_TYPE, REST_ID
ORDER BY FOOD_TYPE DESC;

# 막히기 전까지 작성했던 내용

3. 오류 상황: 음식 종류별로 즐겨찾기 수가 가장 많은 식당 1군데를 찾는 조건을 잘 모르겠음

4. 시도 방법: 윈도우 함수 사용해보려다가 실패함

5. 최종 문제 해결 방법: 생성형AI를 통해 풀이 방법을 알아냈는데, (A,B) IN (...) 처럼 2개의 조건을 IN 구문에 거는 방법과 윈도우 함수를 사용한 방법을 모두 작성해 봄

 

Q49. 식품분류별 가장 비싼 식품의 정보 조회하기

1. 문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/131116

2. 정답 코드:

SELECT
    CATEGORY,
    PRICE AS MAX_PRICE,
    PRODUCT_NAME
FROM FOOD_PRODUCT
WHERE CATEGORY IN ('과자', '국', '김치', '식용유')
  AND (CATEGORY, PRICE) IN (
    SELECT
        CATEGORY,
        MAX(PRICE)
    FROM FOOD_PRODUCT
    GROUP BY CATEGORY
)
ORDER BY PRICE DESC;

# 서브쿼리 사용 + IN 조건 2가지 주기

SELECT
    CATEGORY,
    PRICE AS MAX_PRICE,
    PRODUCT_NAME
FROM (
    SELECT
        *,
        RANK() OVER (
            PARTITION BY CATEGORY
            ORDER BY PRICE DESC
        ) AS rnk
    FROM FOOD_PRODUCT
    WHERE CATEGORY IN ('과자', '국', '김치', '식용유')
) AS t
WHERE rnk = 1
ORDER BY PRICE DESC;

# 윈도우 함수 사용 + RANK 함수 사용

 

Q50. 5월 식품들의 총매출 조회하기

1. 문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/131117

2. 정답 코드:

SELECT
    p.PRODUCT_ID,
    p.PRODUCT_NAME,
    SUM(p.PRICE * o.AMOUNT) AS TOTAL_SALES
FROM FOOD_PRODUCT AS p
JOIN FOOD_ORDER AS o
  ON p.PRODUCT_ID = o.PRODUCT_ID
  AND SUBSTR(o.PRODUCE_DATE, 1, 7) = '2022-05'
GROUP BY p.PRODUCT_ID
ORDER BY TOTAL_SALES DESC, p.PRODUCT_ID ASC;

# SUM(PRICE * AMOUNT) 식 제대로 적용

SELECT
    p.PRODUCT_ID,
    p.PRODUCT_NAME,
    SUM(p.PRICE) OVER (
        PARTITION BY p.PRODUCT_ID
    ) AS TOTAL_SALES
FROM FOOD_PRODUCT AS p
JOIN FOOD_ORDER AS o
  ON p.PRODUCT_ID = o.PRODUCT_ID
  AND SUBSTR(o.PRODUCE_DATE, 1, 7) = '2022-05'
GROUP BY p.PRODUCT_ID
ORDER BY TOTAL_SALES DESC, p.PRODUCT_ID ASC;

# 오류 쿼리 : SUM 결과가 너무 작음

 

3. 오류 상황: 결과 화면에서 TOTAL_SALES에 계속 단가만 표시됨

4. 시도 방법: 윈도우 함수도 사용해 봄

5. 최종 문제 해결 방법: SUM 안에 PRICE * AMOUNT 식을 적용하지 않아서 문제가 됐음

→ 윈도우 함수는 굳이 사용 안해도 됨


라이브 세션) Python 기초 강의 2일차 - 문풀날 [입출력, 변수, 문자열]

입출력 문풀날 연습문제

  • "총액: {:,}원".format(money) → 콤마 넣을 때 { }안에 넣어주기


  • a = int(data[0]) 이런 식으로 리스트형 데이터에서 문자열만 뽑아서 형 변환 후 변수에 저장 가능함!


  • 원래 try 문 안에 input 함수가 들어갈 필요는 없는데, 여기서는 input 으로 받은 값에 바로 int 형 변환을 걸어서 data라는 변수에 값을 저장하기로 했기 때문에 오류 발생 여부를 확인하기 위해 try 문 안으로 들어가야 한다!


  • a, b = map(int, data.split(',')


  • num1 = int(num.replace(',', '')


  • 쉼표 기준으로 먼저 split을 하고, strip을 사용해서 a, b, c를 리스트로 변환
  • a, b, c = [int(p.strip()) for p in clean] → 이때 p는 임의 설정한거라 다른 문자로 해도 됨
  • a, b, c 구할 때 int(p.strip()) 이렇게 해야 정수 형태로 구할 수 있음


  • replace로 쉼표 먼저 지우고, map으로 공백 지우면서 a, b 값 지정해주기


문자열 문풀날 연습문제

문자열은 불변!
기존 값은 바꿀 수 없고, 바꾼 값을 저장해야겠다면 새로운 변수에 지정해줘야 함

 


  • 슬라이싱할 때, 시작과 끝 인덱스가 같으면 범위가 없어서 결과 X


  • S[-1] : 마지막 글자인 n 하나만 문자열 n으로 저장, 49번째라고 하면 오류 발생
  • S[-1:] : 마지막 글자인 n 하나를 리스트 [n]로 저장, 49번째라고 해도 알아서 마지막까지로 인식


  • idx = data.find(':') 를 하면 idx는 4
  • 근데 원래 슬라이싱할 때 숫자+1 해줘야 하므로, idx+1를 해줘야 한다!
  • 결과를 확인하면 ' 적토마' 이렇게 공백이 들어가 있는데, 여기서 strip()을 하면 공백 제거됨!


데이터 분석 파이썬 종합반) 챕터 1 ~ 2

1-5. 변수와 데이터 타입

  • 문자열
  • 숫자열
    • num1 = 7, num2 = 2 이면
      • num1 // num2  = 2  (몫)
      • num1 % num2 = 1  (나머지)
3의 배수, 5의 배수와 같은 수들은 나머지가 0임을 이용해서 구하기 때문에 기억해두면 좋음!
  • 불리언(Boolean) : True / False
  • 결측값(NaN, Not a Number)
  • 입력문(input)

QUIZ1) 숫자 자료형 값을 변수에 저장하고 출력하기

 

2) 문자 자료형 값을 변수에 저장하고 출력하기


어제 배웠던 파이썬 개념을 바탕으로 처음 문제 풀이를 진행해 본 날이었는데, 생각보다 막히는 부분이 많았다.
Gemini를 활용해 문제를 해결하긴 했지만, 파이썬 개념에 대한 이해가 아직 부족하다는 점을 느껴 추가로 파이썬 종합반 강의를 꾸준히 수강해야겠다고 생각했다.

또한 지난주에 진행했던 SQL 성취도 평가에 대한 튜터님의 피드백을 확인했는데, 미처 고려하지 못했던 부분을 짚어주셔서 앞으로 쿼리를 작성할 때 해당 부분을 더욱 신경 써야겠다는 다짐을 하게 되었다.
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/05   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함