내일배움캠프/TIL

[TIL]241212_SQL코드카타, Python 개인과제 문제1~3

dydatablog 2024. 12. 12. 19:47
728x90

코드카타

 

71. 오프라인/온라인 판매 데이터 통합하기

SELECT *
FROM
(
SELECT DATE_FORMAT(sales_date,'%Y-%m-%d') sales_date,
    product_id, user_id,
    sales_amount
FROM online_sale
WHERE sales_date LIKE '2022-03-%'
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 LIKE '2022-03-%') uni
ORDER BY sales_date, product_id, user_id

 

72. 조건에 부합하는 중고거래 댓글 조회하기

-- 오답 쿼리
SELECT b.title, 
    b.board_id, 
    r.reply_id, 
    b.writer_id, 
    r.contents, 
    DATE_FORMAT(r.created_date,'%Y-%m-%d') 'created_date'
FROM used_goods_board b
JOIN used_goods_reply r ON b.writer_id = r.writer_id
WHERE DATE_FORMAT(b.created_date,'%Y-%m-%d') LIKE '2022-10-%'
ORDER BY r.created_date, b.title

오답 쿼리 실행 결과

공통키를 writer_id로 해서 같은 유저로만 묶였다. 보고 싶은 정보는 '각 개시글에 어떤 유저가 댓글을 달았나' 이므로 공통키를 board_id로 설정해야한다.

-- 정답
SELECT b.title, 
    b.board_id, 
    r.reply_id, 
    r.writer_id, 
    r.contents, 
    DATE_FORMAT(r.created_date,'%Y-%m-%d') 'created_date'
FROM used_goods_board b
JOIN used_goods_reply r ON b.board_id = r.board_id
WHERE DATE_FORMAT(b.created_date,'%Y-%m-%d') LIKE '2022-10-%'
ORDER BY 6,1;

 

73.입양 시각 구하기(2)

WITH RECURSIVE hours AS (
	SELECT 0 AS HOUR
	UNION ALL
	SELECT  HOUR + 1 FROM hours
	WHERE HOUR < 23
)
SELECT hours.hour, COALESCE(COUNT(animal_id)) AS 'COUNT'
FROM hours 
LEFT JOIN animal_outs ao ON hours.hour = HOUR(ao.datetime)
GROUP BY hours.hour
ORDER BY hours.hour;

 

풀이: https://dydatablog.tistory.com/62

 

[SQL]SQL반복문_재귀적 CTE(WITH RECURSIVE)

WITH CTE(Common Table Ezpression) : 재귀 쿼리, 계층 구조 쿼리, 크리 구조 쿼리재귀 CTE쿼리란 : 자체 이름을 참조하는 하위 쿼리가 있는 CTE이다. 특히 시리즈 생성이나 계층적 구조의 데이터를 순회할 때

dydatablog.tistory.com

 


파이썬 개인과제

문제1. 짝수 판별하기

  1. 출제의도
    • 조건문을 사용하고 출력함수를 사용할 수 있다.
  2. 배경
    • 당신은 간단한 조건문을 이용해서 숫자를 분별하려고합니다.
  3. 요구사항
    • 무작위 정수 n 이 주어집니다.
    • 변수 n 을 가지고 짝수인지 홀수인지 0인지 출력하는 파이썬 코드를 만드세요. 함수형이 아니여도 괜찮습니다.
    • 짝수는 2로 나누었을때 나누어 떨어지는 숫자입니다.
    • 홀수는 2로 나누었을때 나머지가 1이 남는 숫자 입니다.
    • n = 3, n= 2, n= 0 인 케이스 모두 3가지를 채점할 예정입니다.
n = 3
if n == 0:
  print("이 숫자는 0 입니다.")
elif n % 2 == 0:
  print("이 숫자는 짝수 입니다.")
elif n % 2 == 1:
  print("이 숫자는 홀수 입니다.")

 

문제2. 제품 재고 관리

  1. 출제의도
    • 리스트의 인덱스를 이해하고 원소에 접근할 수 있다.
    • 반복문과 리스트 자료형을 이용하여 기능을 구현할 수 있다.
    • print 내장함수에 변수를 포함시켜 출력할 수 있다.
  2. 배경
    • 당신은 소매점에서 근무하며 제품의 재고 관리를 담당하고 있습니다. 재고가 부족하거나 과잉인 제품을 식별하는 것이 중요합니다. 주어진 제품의 재고 데이터를 확인하여, 재고의 상태를 나타내는 파이썬 코드를 만드세요.
  3. 요구사항
    • inventory_list 리스트의 각 요소는 현재 재고비율 형식의 리스트입니다.
      • 예: [90, 60, 80]
      • 해석: 1번째 아이템은 90%, 2번째 아이템은 60%, 3번째 아이템은 80%의 재고가 남아있습니다.
    • 기준치 value를 받습니다. 기준치 이하면 재고가 부족한 것으로, 기준치 이상이면 재고가 과잉인 것으로 기준치와 같다면 적절한 것으로 간주합니다
    • 각 제품의 재고량이 주어진 기준치보다 많은지 적은지를 적절한지 판단합니다.
    • ex) 기준치를 80로 설정한다면 첫 번째 아이템은 과잉, 두 번째 아이템은 부족입니다, 세번째 아이템은 적절으로 출력하는 기능을 만듭니다.
inventory_list = [90,60,80]
value = 80

print("현재 기준 값은 " + str(value) + "% 입니다.")
for i in inventory_list:
  if i > value :
    print(str(inventory_list.index(i)+1) + "번째 아이템 재고는 " + str(i) + "% 로 과잉입니다.")
  elif i < value : 
    print(str(inventory_list.index(i)+1) + "번째 아이템 재고는 " + str(i) + "% 로 부족입니다.")
  elif i == value : 
    print(str(inventory_list.index(i)+1) + "번째 아이템 재고는 " + str(i) + "% 로 적절합니다.")

주의 : print문에서 텍스트 값끼리 붙일때 str로 숫자 -> 텍스트화 하기

 

문제3: 재품 재고 관리2

  1. 출제의도
    • 함수를 만들 수 있다.
    • 딕셔너리 자료형 접근방법을 이해하며 메소드를 사용할 수 있다.
  2. 배경설명
    • 리스트 형태로 재고를 관리하다보니 재고품목 이름을 기록하지 못하는 문제가 있습니다. 이를 보완하기 위하여 딕셔너리 자료형을 이용해 관리하려고 합니다. 또한 함수형으로 만들어 재사용성을 보완하고자 합니다.
  3. 데이터 설명
  • inventory_dict 딕셔너리의 각 요소는 아이템이름과 수량비율로 표기합니다.
    • ex) {'Apple':90, 'Banana': 60, 'Orange': 80}
    • 해석: Apple은 90% 재고비율, Banna 는 60% 재고비율, Oragne는 80%의 재고비율을 가지고 있습니다.
  • maintain_inventory 는 재고품목과 재고비율을 전달하여 재고 관리를 도와주는 함수입니다.
  • 기능1) inventory_dict 딕셔너리는 재고품목, 재고비율을 전달하면 재고 비율을 업데이트합니다..
    • 기능 1-1) 존재하는 재고 품목이면 재고비율을 갱신합니다. 기존 품목을 업데이트했다고 알립니다.
    • 기능 1-2) 존재하지 않는 재고품목이면 새롭게 만들고 재고비율을 할당합니다. 새로운 재고가 들어왔다고 알립니다.
  • 기능2)
    • 모든 재고품목과 재고비율을 출력합니다.
# 중간 과정1 : 기존 품목의 value 업데이트
inventory_dict  = {'Apple':90, 'Banana': 60, 'Orange': 80}

def maintain_inventory(data_dict, item, update):
    if item in inventory_dict:
      data_dict[item] = update # data_dict에 있는 item키의 값을 update 값으로 갱신해라
      print("기존 품목 " + item + "을 업데이트합니다.")

# 중간 과정 2 : 모든 품목 재고 비율 출력
    for key, value in data_dict.items():  #data_dict에서 반환된 각 키-값 쌍을 순회하면서 키와 값을 각각 key와 value 변수에 저장하여 처리
        print("현재 " + key + "의 재고는 " + str(value) + "% 있습니다.")

maintain_inventory(inventory_dict, 'Apple', 50)

# 출력:
기존 품목 Apple을 업데이트합니다.
현재 Apple의 재고는 50% 있습니다.
현재 Banana의 재고는 60% 있습니다.
현재 Orange의 재고는 80% 있습니다.

 

# 최종 답안 : 딕셔너리에 없는 값 추가
inventory_dict  = {'Apple':90, 'Banana': 60, 'Orange': 80}

def maintain_inventory(data_dict, item, update):
    if item in inventory_dict:
      data_dict[item] = update 
      print("기존 품목 " + item + "을 업데이트합니다.")
    
    else:  
      data_dict[item] = update
      print ("새로운 품목 " + item + "이 입고 되었습니다.")

    for key, value in data_dict.items():
        print("현재 " + key + "의 재고는 " + str(value) + "% 있습니다.")

maintain_inventory(inventory_dict, 'Melon', 40)

# 출력
새로운 품목 Melon이 입고 되었습니다.
현재 Apple의 재고는 90% 있습니다.
현재 Banana의 재고는 60% 있습니다.
현재 Orange의 재고는 80% 있습니다.
현재 Melon의 재고는 40% 있습니다.

 

728x90