TIL - 250412_(SQL_datalemur_7개)

오정수·2025년 4월 12일

TIL

목록 보기
58/78

문제1 (링크)

SELECT
  card_name
  , MAX(issued_amount) - MIN(issued_amount) difference
FROM monthly_cards_issued
GROUP BY card_name
ORDER BY difference DESC

문제2 (링크)

# 오류 코드
SELECT
  ROUND(1.0 * SUM(item_count*order_occurrences) / SUM(order_occurrences),1)
FROM items_per_order

# 작동 코드
SELECT
  CAST(1.0 * SUM(item_count*order_occurrences) / SUM(order_occurrences) AS DECIMAL (10,1))
FROM items_per_order

비고 : 이건 아직 정확하게 모르겠다. 어느 환경에선 ROUND가 작동하지 않는다. 그럴 때 CAST 함수로 형식을 바꿔주면 된다. 위와 같은 방법도 되지만 가장 안전한 방법은 아래와 같다고 한다.

ROUND(CAST(1.0 * ... AS numeric), 2)

문제3 (링크)

SELECT
  drug
  , total_sales - cogs AS total_profit
FROM pharmacy_sales
ORDER BY 2 DESC 
LIMIT 3

문제4 (링크)

SELECT
  manufacturer
  , COUNT(DISTINCT drug) AS drug_count
  , SUM(cogs) - SUM(total_sales) AS total_loss
FROM pharmacy_sales
WHERE total_sales < cogs
GROUP BY 1
ORDER BY 3 DESC

문제5 (링크)

SELECT
  manufacturer
  , CONCAT('$',ROUND(SUM(total_sales)/1000000),' million') AS sale
FROM pharmacy_sales
GROUP BY 1
ORDER BY SUM(total_sales) DESC

비고 : CONCAT을 통해 양식을 만들었다. 문자열이기 때문에 ORDER BY 2를 하면 원하는대로 정렬이 안 될 거라 따로 SUM(total_sales)를 이용하는 것이 바람직하다.

문제6 (링크)

SELECT
  COUNT(*)
FROM 
  (
  SELECT
    policy_holder_id
    , COUNT(case_id) cnt
  FROM callers
  GROUP BY 1
  ) a
WHERE cnt > 2

비고 : HAVING에는 alias가 안된다. MySQL에는 일부 허용인데 PostgreSQL에서는 막는다고 한다.

문제7 (링크)

SELECT
  user_id, spend, transaction_date
FROM
(
  SELECT
    *
    , ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY transaction_date) numbers
  FROM transactions
) a
WHERE numbers = 3

비고 : 윈도우 함수에 잊고 있었다. 이 문제를 통해 윈도우 함수를 다시 상기시켰다.

profile
안녕하세요 오정수입니다

0개의 댓글