SELECT
card_name
, MAX(issued_amount) - MIN(issued_amount) difference
FROM monthly_cards_issued
GROUP BY card_name
ORDER BY difference DESC
# 오류 코드
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)
SELECT
drug
, total_sales - cogs AS total_profit
FROM pharmacy_sales
ORDER BY 2 DESC
LIMIT 3
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
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)를 이용하는 것이 바람직하다.
SELECT
COUNT(*)
FROM
(
SELECT
policy_holder_id
, COUNT(case_id) cnt
FROM callers
GROUP BY 1
) a
WHERE cnt > 2
비고 : HAVING에는 alias가 안된다. MySQL에는 일부 허용인데 PostgreSQL에서는 막는다고 한다.
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
비고 : 윈도우 함수에 잊고 있었다. 이 문제를 통해 윈도우 함수를 다시 상기시켰다.