๐๐๐ก๐๐๐๐๐
SQL ๋ณธ๋ฌธ
Q. '[์ง์ญ(์๋)] ์์์ ์ด๋ฆ(์์์ข ๋ฅ)' ์ปฌ๋ผ ๋ง๋ค๊ณ , ์ด ์ฃผ๋ฌธ๊ฑด์ ๋ง๋ค๊ธฐ
A. select concat('[', subst(abbr,1,2),']',restaurant_name,
'(',cusine_type,')',"์์์ ", count(1) "์ฃผ๋ฌธ ๊ฑด์"
from food_orders
group by 1
- ์ด๋ค ํ ์ด๋ธ์์ ๋ฐ์ดํฐ ๋ฝ์์ง : from food_orders
- ์ด๋ค ์ปฌ๋ผ : addr,restaurant_name,cusine_type,order_id
- ์ด๋ค ์กฐ๊ฑด : x
- ์ด๋ค ํจ์ : ๊ฐฏ์(count),ํน์ ๋ฌธ์๋ง ๋ฝ๋ ๊ฑฐ(subst),๋ฌธ์ ํฉ์น๋ ๊ฑฐ(group by, concat)
Q. ๋ค์์ ์กฐ๊ฑด์ผ๋ก ๋ฐฐ๋ฌ์๊ฐ์ด ๋ฆ์๋์ง ํ๋จํ๋ ๊ฐ
(์ฃผ์ค 25๋ถ์ด์, ์ฃผ๋ง 30๋ถ์ด์)
1. SQL๋ฌธ์ ๊ธฐ๋ณธ ๊ตฌ์กฐ๋ก ์์
2. ์กฐ๊ฑด์ ์ฌ๋ฌ๋ฒ ์ ์ฉํ ๋ if, case ๋ฌธ ์ค ์ด๋ค ๊ฒ์ ์ด์ฉํ ์ง ๊ฒฐ์
3. ์กฐ๊ฑด์ '์ฃผ์ค, ์ฃผ๋ง'์กฐ๊ฑด๊ณผ '๋ฐฐ๋ฌ ์๊ฐ'์กฐ๊ฑด์ ๋์์ ์ค ๋ ์ฌ์ฉํ ๋
ผ๋ฆฌ์ฐ์ฐ์
A. select order_id,
restaurant_name,
day_of_the_week,
delivery_rime,
case when day_of_the_week='weekday' and delivery_time>=25 then 'Late'
when day_of_the_week='weekend' and delivery>=30 then 'Late'
else 'On-time' and "์ง์ฐ์ฌ๋ถ"
from food_orders
Q. ๊ฐ๊ฒฉ์ด ์ ์ผ ๋น์ผ ์ํ์ ์ ๋ณด ์ถ๋ ฅํ๊ธฐ
A. select *
from food_product
order by price desc
limit 1
limit์ผ๋ก ํ ์นธ๋ง ๋ฐ๋ฆฌ๊ณ ์ค๊ธฐ
A. select product_id,
product_name,
product_cd,
category,
price
from food_product
where price = (select max(price) from food_product
์คํ์์๋๋ฌธ์ where ์ ์์ max ํจ์๊ฐ ์คํ์ด ์ ๋ !
์คํ์์ ์ฐธ๊ณ ํ๊ธฐ
Q. ๋ฐฐ์ก๋ ์ฃผ๋ฌธ์ ๊ธฐ์ค์ผ๋ก ๊ณ ์ ๊ณ ๊ฐ์, ์ด ์ฃผ๋ฌธ ์, ์ด ๊ฒฐ์ ๊ธ์ก, ๊ทธ๋ฆฌ๊ณ ๊ณ ๊ฐ 1๋ช ๋น ํ๊ท ๊ฒฐ์ ์ก
- cnt_users, cnt_roders, sum_payment, arppu
๋ด ๋ต์
select count(customer_id) as cnt_users,
count(order_if) cnt_orders,
sum(payment_value) sum_payment
from orders
inner join payment p on o.order_id = p.order_id
where order_status= 'delivered'
group by p.payment_type -- ๋ฐ๋ณด๋ฉ์ฒญ์ด
์ ๋ต
SELECT
COUNT(DISTINCT o.customer_id) AS cnt_users,
COUNT(o.order_id) AS cnt_orders,
SUM(p.payment_value) AS sum_payment,
if(COUNT(DISTINCT o.customer_id) = 0, 0, SUM(p.payment_value) / COUNT(DISTINCT o.customer_id)) AS ARPPU
FROM orders o
INNER JOIN payments p ON o.order_id = p.order_id
WHERE o.order_status = 'delivered';
Q. payment ํ ์ด๋ธ์์ ๊ฐ ๊ฒฐ์ ๋ฐฉ์๋ณ / ๊ฒฐ์ ๊ธ์ก์ ํฉ๊ณ์ / ํด๋น ๊ฒฐ์ ๋ฐฉ์์ด ์ ์ฒด ๊ฒฐ์ ๊ธ์ก์์ ์ฐจ์งํ๋ ๋น์จ์ ๊ณ์ฐ
- payment_type, total_payment_value, payment_percentage
๋ด ๋ต์
SELECT payment_type,
COUNT(*) ,
SUM(payment_value)
from payments ;
where payment_value /
group by 1
์ ๋ต
SELECT
payment_type,
SUM(payment_value) AS total_payment_value,
ROUND(SUM(payment_value) * 100.0 / (SELECT SUM(payment_value) FROM payments), 2) AS payment_percentage
FROM payments
GROUP BY 1
ORDER BY 2 DESC;
Q. ๋ฐฐ์ก๋ ์ฃผ๋ฌธ์ ๊ธฐ์ค์ผ๋ก / ๊ณ ์ ๊ณ ๊ฐ ์, ์ด ์ฃผ๋ฌธ ์, ์ด ๊ฒฐ์ ๊ธ์ก, / ๊ทธ๋ฆฌ๊ณ ๊ณ ๊ฐ 1๋ช ๋น ํ๊ท ๊ฒฐ์ ์ก์ ๊ณ์ฐ
๋ด ๋ต์
SELECT COUNT(customer_id) as cnt_users,
COUNT(order_id) cnt_orders,
sum(payment_value) sum payment
from orders
inner join payments p
on o.order_id = p.order_id
WHERE order_status = 'delivered'
group by p.payment_type ;
์ ๋ต
SELECT
COUNT(DISTINCT o.customer_id) AS cnt_users,
COUNT(o.order_id) AS cnt_orders,
SUM(p.payment_value) AS sum_payment,
CASE
WHEN COUNT(DISTINCT o.customer_id) = 0 THEN 0
ELSE SUM(p.payment_value) / COUNT(DISTINCT o.customer_id)
END AS arppu
FROM orders o
INNER JOIN payments p ON o.order_id = p.order_id
WHERE o.order_status = 'delivered';
Q. REST_INFO ํ ์ด๋ธ์์ (์์์ข ๋ฅ๋ณ)๋ก (์ฆ๊ฒจ์ฐพ๊ธฐ์๊ฐ ๊ฐ์ฅ ๋ง์ ์๋น)์ [์์ ์ข ๋ฅ, ID, ์๋น ์ด๋ฆ, ์ฆ๊ฒจ์ฐพ๊ธฐ์]๋ฅผ ์กฐํํ๋ SQL๋ฌธ์ ์์ฑํด์ฃผ์ธ์. ์ด๋ ๊ฒฐ๊ณผ๋ ์์ ์ข ๋ฅ๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌํด์ฃผ์ธ์.
๋ ์ด๋ ๊ฒ ํ๋๊ฑฐ ๊ฐ์๋ฐ ๊ฐ๋ฌผ๊ฐ๋ฌผํ๋ค ๋ฒ์จ ..............
select category, price, product_name
from food_product t1
where price = (
select max(price)
from food_product
where t1.category = category)
and category in ('๊ณผ์', '๊ตญ', '๊น์น', '์์ฉ์ ')
order by price desc
ํํฐ๋ ๋ต์
SELECT category,
price,
product_name
from food_product
where (category, price) in (
SELECT category,
max(price)
from food_product
where category in ('๊ณผ์', '๊ตญ', '๊น์น', '์์ฉ์ ')
group by 1
)
order by 2 desc
๋์ค์ ์ปฌ๋ผ์ด ๋ ๋ง์์ง๋ฉด ์ํ๋ ๊ฐ์ด ๋์ฌ ์๋ ์์ด์ ์ด๋ ๊ฒ ๋ฐ๊ฟ์ ํ๊ธฐ !
๐ป๋ง์ฝ ์ฌ๊ธฐ์ having ์ฌ์ฉํด์ ๊ธ์ก 10,000์ ์ด์์ธ ๊ฒ์ ์ฐพ์๋ณด๋ฉด ?
SELECT category,
max(price)
from food_product
where category not in ('๊ณผ์', '๊ตญ', '๊น์น', '์์ฉ์ ')
group by 1
having max(price) >= 10000
ROM โ FROMโ ON โ JOIN โ WHERE โ GROUP BY โ HAVING โ ์๋์ฐ ํจ์โ SELECT โDISTINCT โ ORDER BY โ LIMIT