# 第四堂:後台專案實戰 - 管理者端資料庫規劃 * 記得錄影 * [Gamma 簡報](https://gamma.app/docs/SQL--23heyix4r93u5u0?mode=doc) ## group by 分組資料 * [簡報](https://gamma.app/docs/SQL--23heyix4r93u5u0?mode=present#card-sipi7d9pjizbszb) 員工部門模擬資料 ```sql -- 建立部門資料表 CREATE TABLE teams ( id SERIAL PRIMARY KEY, -- 部門編號,主鍵 name VARCHAR(50) -- 部門名稱 ); -- 建立員工資料表 CREATE TABLE users ( id SERIAL PRIMARY KEY, -- 員工編號,主鍵 name VARCHAR(50), -- 姓名 salary INTEGER, -- 薪資 team_id INTEGER, -- 部門編號,外來鍵 FOREIGN KEY (team_id) REFERENCES teams(id) -- 設定外來鍵關聯 ); -- 新增部門資料 INSERT INTO teams (name) VALUES ('開發部'), ('人事部'), ('行銷部'); -- 新增員工資料 INSERT INTO users (name, salary, team_id) VALUES ('張小明', 45000, 1), ('王大明', 48000, 1), ('李小華', 43000, 2), ('陳小玉', 55000, 2), ('林小豪', 47000, 1), ('王小銷', 55000, 3), ('林中美', 47000, 3); ``` ## Join * [簡報](https://gamma.app/docs/SQL--23heyix4r93u5u0?mode=present#card-qppyrqlm15xjiqu) ![截圖 2024-11-29 下午12.22.48](https://hackmd.io/_uploads/r1Uib6IQyl.png) ## 中場休息 ## 任務二資訊 * [wireframe 線稿圖](https://miro.com/app/board/uXjVLbiDml0=/?share_link_id=404709829822) * [建立 Table 資料表指令](https://hackmd.io/@hexschool/SkpaT_jfye) * [資料表全覽](https://images.hexschool.com/common/MTc1Mzc2NDQzNDQ4MzQ1MjMxMzc=_2024-11-26T15:23:35Z.png) * [5-6 大題圖解](https://miro.com/app/board/uXjVL-Selqk=/?share_link_id=363174833180) ## 解題五六題 ## 5\. 客戶預約與授課 `COURSE_BOOKING` 王小明 Email:`wXlTq@hexschooltest.io` 好野人 Email:`richman@hexschooltest.io` **1\. 新增**:請在 `COURSE_BOOKING` 新增兩筆資料: 第一筆:新增 `王小明`預約 `李燕容` 的課程 - 預約人設為`王小明` - 預約時間`booking_at` 設為2024-11-24 16:00:00 - 狀態`status` 設定為即將授課 第二筆:新增: `好野人` 預約 `李燕容` 的課程 - 預約人設為 `好野人` - 預約時間`booking_at` 設為2024-11-24 16:00:00 - 狀態`status` 設定為即將授課 ```sql insert into "COURSE_BOOKING" (user_id, course_id, booking_at, status) values ((select id from "USER" where email = 'wXlTq@hexschooltest.io'), (select id from "COURSE" where user_id = (select id from "USER" where email = 'lee2000@hexschooltest.io')), '2024-11-24 16:00:00', '即將授課'), ((select id from "USER" where email = 'richman@hexschooltest.io'), (select id from "COURSE" where user_id = (select id from "USER" where email = 'lee2000@hexschooltest.io')), '2024-11-24 16:00:00', '即將授課'); ``` **2\. 修改**:`王小明`取消預約 `李燕容` 的課程,請在`COURSE_BOOKING`更新該筆預約資料: - 取消預約時間`cancelled_at` 設為2024-11-24 17:00:00 - 狀態`status` 設定為課程已取消 ```sql= update "COURSE_BOOKING" set cancelled_at = '2024-11-24 17:00:00',status = '課程已取消' where user_id = (select id from "USER" where email = 'wXlTq@hexschooltest.io') and course_id = (select id from "COURSE" where user_id = (select id from "USER" where email = 'lee2000@hexschooltest.io')); ``` **3\. 新增**:`王小明`再次預約 `李燕容` 的課程,請在`COURSE_BOOKING`新增一筆資料: - 預約人設為`王小明` - 預約時間`booking_at` 設為2024-11-24 17:10:25 - 狀態`status` 設定為即將授課 ```sql insert into "COURSE_BOOKING" (user_id, course_id, booking_at, status) values ((select id from "USER" where email = 'wXlTq@hexschooltest.io'), (select id from "COURSE" where user_id = (select id from "USER" where email = 'lee2000@hexschooltest.io')), '2024-11-24 17:10:25', '即將授課'); ``` **4\. 查詢**:取得`王小明`所有的預約紀錄,包含取消預約的紀錄 ```sql select * from "COURSE_BOOKING" where user_id = ( select id from "USER" where email = 'wXlTq@hexschooltest.io' ); ``` ![截圖 2024-11-29 下午3.07.58](https://hackmd.io/_uploads/r12LukP7Je.png) **5\. 修改**:`王小明` 現在已經加入 `李燕容` 的課程直播室了,請在 `COURSE_BOOKING` 更新該筆預約資料(請注意,不要更新到已經取消的紀錄): - 請在該筆預約記錄他的加入直播室時間 `join_at` 設為2024-11-25 14:01:59 - 狀態`status` 設定為上課中 ```sql update "COURSE_BOOKING" set join_at = '2024-11-25 14:01:59', status= '上課中' where user_id = (select id from "USER" where email = 'wXlTq@hexschooltest.io') and course_id = (select id from "COURSE" where user_id = (select id from "USER" where email = 'lee2000@hexschooltest.io')) and status = '即將授課'; ``` **6\. 查詢**:計算用戶王小明的購買堂數。 (需使用到 SUM 函式與 Group By),顯示須包含以下欄位: `user_id` , `total` ![截圖 2024-11-29 下午3.09.45](https://hackmd.io/_uploads/r1u0O1D7ye.png) ```sql select "CREDIT_PURCHASE".user_id, sum("CREDIT_PURCHASE".purchased_credits) as total from "CREDIT_PURCHASE" where "CREDIT_PURCHASE".user_id = (select id from "USER" where email = 'wXlTq@hexschooltest.io') group by "CREDIT_PURCHASE".user_id; ``` **7\. 查詢**:計算用戶王小明的已使用堂數。 (需使用到 Count 函式與 Group By),顯示須包含以下欄位: `user_id` , `total` ![截圖 2024-11-29 下午3.10.23](https://hackmd.io/_uploads/HJAJK1DXJg.png) ```sql select "COURSE_BOOKING".user_id, count(*) as total from "COURSE_BOOKING" where "COURSE_BOOKING".user_id = (select id from "USER" where email = 'wXlTq@hexschooltest.io') and status != '課程已取消' group by "COURSE_BOOKING".user_id; ``` ## 6\. 後台報表 **1\. 查詢**:查詢專長為 `重訓` 的教練,並按經驗年數排序,由資深到資淺(需使用 inner join 與 order by 語法) ,顯示須包含以下欄位: 教練名稱 , 經驗年數, 專長名稱 ![截圖 2024-11-29 下午3.04.55](https://hackmd.io/_uploads/Hy4oPkvXkx.png) ```sql select "USER"."name" as "教練名稱", "COACH".experience_years as "經驗年數", "SKILL".name as "專長名稱" from "COACH_LINK_SKILL" inner JOIN "SKILL" on "SKILL".id = "COACH_LINK_SKILL".skill_id inner JOIN "COACH" on "COACH".id = "COACH_LINK_SKILL".coach_id inner JOIN "USER" on "USER".id = "COACH".user_id where "COACH_LINK_SKILL".skill_id = (select id from "SKILL" where name = '重訓') order by "COACH".experience_years desc; ``` **2\. 查詢**:查詢每種專長的教練數量,並只列出教練數量最多的專長(需使用 group by, inner join 與 order by 與 limit 語法),顯示須包含以下欄位: 專長名稱, coach\_total ![截圖 2024-11-29 下午3.04.34](https://hackmd.io/_uploads/HJkcDyD7Je.png) ```sql select "SKILL".name as "專長名稱", count(*) as coach_total from "COACH_LINK_SKILL" inner JOIN "SKILL" on "SKILL".id = "COACH_LINK_SKILL".skill_id group by "SKILL".name order by coach_total desc limit 1; ``` **3\. 查詢**:計算 11 月份組合包方案的銷售數量,顯示須包含以下欄位: 組合包方案名稱, 銷售數量 ![截圖 2024-11-29 下午3.02.52](https://hackmd.io/_uploads/Bylrvkw71x.png) ```sql select "CREDIT_PACKAGE".name as "組合包方案名稱", count(*) as "銷售數量" from "CREDIT_PURCHASE" inner join "CREDIT_PACKAGE" on "CREDIT_PACKAGE".id = "CREDIT_PURCHASE".credit_package_id where "CREDIT_PURCHASE".created_at >= '2024-11-01 00:00:00' and "CREDIT_PURCHASE".created_at <= '2024-11-30 23:59:59' group by "CREDIT_PACKAGE".name; ``` **4\. 查詢**:計算 11 月份總營收(使用 purchase\_at 欄位統計),顯示須包含以下欄位: 總營收 ![截圖 2024-11-29 下午3.03.37](https://hackmd.io/_uploads/Sy88v1Pm1x.png) ```sql select sum(price_paid) as "總營收" from "CREDIT_PURCHASE" where "CREDIT_PURCHASE".purchase_at >= '2024-11-01 00:00:00' and "CREDIT_PURCHASE".purchase_at <= '2024-11-30 23:59:59'; ``` **5\. 查詢**:計算 11 月份有預約課程的會員人數(需使用 Distinct,並用 created\_at 和 status 欄位統計),顯示須包含以下欄位: 預約會員人數 ![截圖 2024-11-29 下午3.03.53](https://hackmd.io/_uploads/Hk_vDJP71l.png) ```sql select count(Distinct("COURSE_BOOKING".user_id)) as "預約會員人數" from "COURSE_BOOKING" where "COURSE_BOOKING".created_at >= '2024-11-01 00:00:00' and "COURSE_BOOKING".created_at <= '2024-11-30 23:59:59' and "COURSE_BOOKING".status != '課程已取消'; ```