2024-10-12

Suhyeon Lee·2024년 10월 12일
0

CodeKata

SQL

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

  • 작성한 쿼리
SELECT
  fp.product_id
  , fp.product_name
  , SUM(fp.price*fo.amount) AS total_sales
FROM
  food_product fp
  JOIN food_order fo
  ON fp.product_id = fo.product_id
  AND MONTH(fo.produce_date) = 5
GROUP BY
  fp.product_id
  , fp.product_name
ORDER BY
  SUM(fp.price*fo.amount) DESC
  , fp.product_id
;
  • ON에 조건을 넣는 것보다는 WHERE에 조건을 넣는 걸 추천

    • ON: JOIN을 하기 전 필터링(= ON 조건으로 필터링이 된 레코드 간 JOIN)
    • WHERE: JOIN을 한 후 필터링(= JOIN을 한 결과에서 WHERE 조건절로 필터링)
    • cf. HAVING: GROUP BY를 한 후 필터링
    • ON vs. WHERE
  • 2022년이 아닌 값이 있을 수 있느니 년도 조건도 추가해야 함

    • 전체 테이블이 2022인 걸 확인해서 저렇게 적었는데 반성
      → 문제에서 요구하는 건 전부 쿼리에 구현하기!!
SELECT
  fp.product_id
  , fp.product_name
  , SUM(fp.price*fo.amount) AS total_sales
FROM
  food_product fp
  JOIN food_order fo
  ON fp.product_id = fo.product_id
WHERE
  YEAR(fo.product_date) = 2020
  AND MONTH(fo.produce_date) = 5
GROUP BY
  fp.product_id
  , fp.product_name
ORDER BY
  SUM(fp.price*fo.amount) DESC
  , fp.product_id
;
  • WHERE절을 WHERE produce_date LIKE '2022-05%'로 작성해도 됨

  • 추가: 참고하면 좋을 쿼리

SELECT
  fp.product_id
  , fp.product_name
  , SUM(fp.price * a.amount) AS total_sales
FROM
  food_product fp
  JOIN (
    SELECT
      product_id
      , amount
    FROM
      food_order
    WHERE
      produce_date
      BETWEEN STR_TO_DATE(CONCAT('2022-05', '-01'), '%Y-%m-%d')
      AND LAST_DAY(STR_TO_DATE(CONCAT('2022-05', '-01'), '%Y-%m-%d'))
-- GROUP 전 해당 날짜를 가져와야 GROUP 때 다른 날짜의 AMOUNT 를 합산하지 않습니다.
-- '2022-05' 리터럴은 파라미터로 변경 될 수 있는 값이기에 YYYY-MM 의 월초, 월말을 구합니다
-- 컬럼을 형변환 할 시 성능 저하가 발생하여 지양합니다.
  ) AS a
  ON fp.product_id = a.product_id
-- FOOD_ORDER 테이블의 건수가 많을 경우 조회 대상을 먼저 줄인 후
-- FOOD_PRODUCT 테이블과 JOIN하여 성능 향상을 기대할 수 있습니다.
GROUP BY
  fp.product_id
  , fp.product_name
ORDER BY
  SUM(fp.price * a.amount) DESC
  , fp.product_id ASC
;

Python

8. 각도기

  • 작성한 코드
def solution(angle):
	return ((angle//90)*2)+((angle%90>0)*1)
  • 처음에는 아래와 같이 적었는데 너무 길어서 좀 짧게 작성해보고 싶어 고민을 많이 하다가 위와 같이 제출
def solution(angle):
	if 0 < angle < 90:
    	return 1
    elif angle == 90:
    	return 2
    elif 90 < angle < 180:
    	return 3
    elif angle == 180:
    	return 4
    else:
    	return 'error'

참고할 만한 다른 풀이

def solution(angle):
	if angle <= 90:
    	return 1 if angle < 90 else 2
    elst:
    	return 3 if angel < 180 else 4
def solution(angle):
    return [[1, 2], [3, 4]][angle > 90][angle % 90 == 0]

# 유사한 다른 풀이
solution=lambda x:[[1,2],[0,3,4]][x>90][x//90]
def solution(angle):
    angles = [0, 90, 91, 180]
    return len([k for k in angles if k<=angle])
profile
2 B R 0 2 B

0개의 댓글