Welcome 歡迎光臨! 愛上網路-原本退步是向前 !

由淺入深的 SQL 練習 30 題:咖啡廳篇

本題目主要來自下列網站,原始題目及資料請到下列網站查詢

https://www.bonnie-chou.com/posts/sql-challenges-30-coffee-shop

但部份題目資料有問題所以無法實作出來

 

基礎難度

1. customer 表前 5 筆資料列出來

SELECT*

FROM customer

LIMIT 5

 

2. 查詢所有熱飲 (hot = 1) 的飲品名稱與價格

SELECT dname ,price

FROM drink 

WHERE hot=1

 

3. 找出年齡 ≥ 30 歲的會員姓名與年齡

SELECT *

FROM customer

WHERE age >=30

 

4. 列出 2025-01-19 全部訂單編號與對應會員編號

SELECT oid,

       cid,

       DATE(order_dt)

FROM orders

WHERE DATE(order_dt) = "2025-01-19"

 

5. 計算性別為 'M' 的會員人數

SELECT COUNT(*)

FROM customer

WHERE gender="F"

 

 

6. 使用 LIKE 找出會員姓名以 'C' 開頭者的會員編號與姓名

SELECT *

FROM customer

WHERE cname LIKE "C%"

 

7. 查詢 2025-01-23 當天的訂單總筆數

SELECT COUNT(*)

FROM orders

WHERE date(order_dt)="2025-01-23"

 

8. 查詢 price > 120 的飲品編號與名稱,依價格由高到低排序

SELECT did,dname 

from drink

WHERE price >120

ORDER BY price DESC 

 

9. 列出 order_item qty >= 2 的紀錄 (顯示訂單編號、飲品編號、數量)

SELECT *

From order_item

WHERE qty >=2

 

10. 找出 shift 表裡排 Evening 班的店員姓名 (不重複)

SELECT DISTINCT bname 

from shift

LEFT JOIN barista USING(bid)

WHERE shift="Evening"

 

中等難度

1. 計算各飲品的總銷售杯數

SELECT did,dname,SUM(qty) AS 銷售量

FROM order_item

LEFT JOIN drink USING(did)

GROUP BY did 

 

2. 列出每位店員的接單金額 (金額=qty * price),並依金額降序

SELECT bid,bname ,sum(qty*price) AS 銷售金額

FROM orders

LEFT JOIN order_item USING(oid)

LEFT JOIN barista USING(bid)

LEFT  JOIN drink USING(did)

GROUP BY bid 

ORDER BY   銷售金額 desc

 

3. 找出會員 c002 累積消費總額

SELECT cid,cname ,sum(qty*price )AS 銷售金額

FROM orders

LEFT JOIN order_item USING(oid)

LEFT JOIN customer USING(cid)

LEFT  JOIN drink USING(did)

WHERE cid ="c002"

 

4. 列出沒有被點過的飲品編號與名稱(資料不存,每項目都有點過)

SELECT did,dname

FROM drink

WHERE did NOT IN 

(

SELECT DISTINCT did

FROM order_item)

 

 

5. 對每位會員統計第一次銷費點單日期

SELECT cid ,MIN(order_dt)

FROM orders

GROUP BY cid

 

 

6. 找出一天內下 2 筆以上訂單的會員編號與下單日期(沒有這個資料)

 

7. 查詢平均杯數 > 1 的訂單編號與平均杯數 (提示: AVG(qty))

SELECT oid,

       AVG(qty) AS AVGS

FROM orders

LEFT JOIN order_item USING(oid)

GROUP BY oid

HAVING avgs >1

 

8. 列出每種飲品的單日最高銷售杯數與日期

WITH dailysales

     AS (

        -- 步驟 1:先計算每種飲品在每天的總銷售杯數

        SELECT order_dt,

               did,

               Sum(qty) AS total_qty

         FROM   orders

                LEFT JOIN order_item using(oid)

         GROUP  BY order_dt,

                   did),

     rankedsales

     AS (

        -- 步驟 2:在每種飲品的分組內,依據銷量由高到低排名

        SELECT order_dt,

               did,

               total_qty,

               Row_number()

                 OVER (

                   partition BY did

                   ORDER BY total_qty DESC, order_dt DESC ) AS rank_num

         FROM   dailysales)

SELECT *

FROM   rankedsales

WHERE  rank_num = 1 

 

 

9. 使用 GROUP_CONCAT 把同一張訂單中的飲品名稱用逗號串起來顯示 (顯示訂單編號與飲品清單)

SELECT oid,GROUP_CONCAT(CONCAT(did," ",dname)) AS drink_list 

FROM orders

LEFT JOIN order_item USING(oid)

LEFT JOIN drink USING(did)

GROUP BY oid 

 

 

10. 找出 2025-01-19 2025-01-21 之間,每天營業額最高的店員姓名與金額

WITH daysale AS

  (-- 步驟 1:先計算每個員工在每天的每筆訂單銷售額

 SELECT order_dt,

        bid,

        oid,

        Sum(qty*price) AS total_qty

   FROM orders

   LEFT JOIN order_item USING(oid)

   LEFT JOIN drink USING(did) GROUP  BY order_dt,

                                        bid,

                                        oid),

     rankdaysale AS

  (-- 步驟 2:員工在每天的每筆訂單,依據銷量由高到低排名

 SELECT order_dt,

        bid,

        oid,

        total_qty,

        Row_number() OVER (PARTITION BY bid

                           ORDER BY total_qty DESC, order_dt DESC) AS rank_num

   FROM daysale)

SELECT *

FROM rankdaysale

WHERE rank_num=1

 

 

 

[ 資料庫 ] 瀏覽次數 : 29 更新日期 : 2026/06/21