๐‘๐‘œ๐‘ก๐‘’๐‘๐‘œ๐‘œ๐‘˜

SQL ๋ณธ๋ฌธ

๋ฌธ์ œ์ •๋ฆฌ โœ๏ธ

SQL

seoa__ 2025. 1. 10. 13:17

 

Q. '[์ง€์—ญ(์‹œ๋„)] ์Œ์‹์ ์ด๋ฆ„(์Œ์‹์ข…๋ฅ˜)' ์ปฌ๋Ÿผ ๋งŒ๋“ค๊ณ , ์ด ์ฃผ๋ฌธ๊ฑด์ˆ˜ ๋งŒ๋“ค๊ธฐ

A. select concat('[', subst(abbr,1,2),']',restaurant_name,
'(',cusine_type,')',"์Œ์‹์ ", count(1) "์ฃผ๋ฌธ ๊ฑด์ˆ˜"
from food_orders
group by 1

 

  1. ์–ด๋–ค ํ…Œ์ด๋ธ”์—์„œ ๋ฐ์ดํ„ฐ ๋ฝ‘์„์ง€ : from food_orders
  2. ์–ด๋–ค ์ปฌ๋Ÿผ : addr,restaurant_name,cusine_type,order_id
  3. ์–ด๋–ค ์กฐ๊ฑด : x
  4. ์–ด๋–ค ํ•จ์ˆ˜ : ๊ฐฏ์ˆ˜(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