case when(自定义分组):
SELECT
first_name,
last_name,
hire_date,
CASE
WHEN hire_date > '2014-01-01' THEN 'junior'
WHEN hire_date > '2013-01-01' THEN 'middle'
WHEN hire_date <= '2013-01-01' THEN 'senior'
END AS experience
FROM employees;
在case when中使用else:
SELECT
order_id,
customer_id,
ship_country,
CASE
WHEN ship_country = 'USA' OR ship_country = 'Canada' THEN 0.0
ELSE 10.0
END AS shipping_cost
FROM orders
WHERE order_id BETWEEN 10720 AND 10730 ;
在group by中使用case when:
SELECT
CASE4
WHEN ship_country = 'USA' OR ship_country = 'Canada' THEN 0.0
ELSE 10.0
END AS shipping_cost,
COUNT ( * ) AS order_count
FROM orders
GROUP BY
CASE
WHEN ship_country = 'USA' OR ship_country = 'Canada' THEN 0.0
ELSE 10.0
END ;
case when 和 count():
SELECT
COUNT ( CASE
WHEN ship_country = 'USA' OR ship_country = 'Canada' THEN order_id
END ) AS free_shipping,
COUNT ( CASE
WHEN ship_country != 'USA' AND ship_country != 'Canada' THEN order_id
END ) AS paid_shipping
FROM orders;
使用case when 和 group by 组合使用:
SELECT
ship_country,
COUNT ( CASE
WHEN freight < 40.0 THEN order_id
END ) AS low_freight,
COUNT ( CASE
WHEN freight >= 40.0 AND freight < 80.0 THEN order_id
END ) AS avg_freight,
COUNT ( CASE
WHEN freight >= 80.0 THEN order_id
END ) AS high_freight
FROM orders
GROUP BY ship_country;
sum()中使用case when:
SELECT
SUM ( CASE
WHEN ship_country = 'USA' OR ship_country = 'Canada' THEN 1
END ) AS free_shipping,
SUM ( CASE
WHEN ship_country != 'USA' AND ship_country != 'Canada' THEN 1
END ) AS paid_shipping
FROM orders;
sum中使用case when 进行复杂计算:
SELECT
o. order_id,
SUM ( oi. quantity * oi. unit_price * ( 1 - oi. discount) ) AS total_price,
SUM ( CASE
WHEN p. category_id in ( 6 , 8 ) THEN oi. quantity * oi. unit_price * ( 1 - oi. discount)
ELSE 0
END ) AS non_vegetarian_price
FROM orders o
JOIN order_items oi
ON o. order_id = oi. order_id
JOIN products p
ON p. product_id = oi. product_id
GROUP BY o. order_id;