# CH10打造可重複分析用的自訂資料集
### ad-hoc reporting(即席報表)
接受特定提問 -> 探索資料庫 -> 攥寫SQL提取所需的資料 -> 進行分析得到問題的答案
## 10-1 思考自訂資料集的需求
### 考慮需要用到的度量值與維度
度量值是指可被量化與分析的資料(如銷售額),可以將度量值衍生或轉換出評估用的指標,並以各種維度(例如月份)做分析,如同從不同角度與視野去觀察這些資料
### 根據組成的資料集來確認是否可以回答預期問題
假設常問的問題:
1. 上週市集營業額是多少?
2. 上個星期三與星期六營業額相比
3. 想知道某段時間的總營業額?
4. 針對每週市場的營業額進行定期追蹤
5. 將每週銷售額以供應商為單位匯總


將各種常用條件加入到sql之中,組成一張表
## 10-2 可重複使用自訂資料集的方法:CTEs和Views
* CTEs(公共表達式,Common Table Expressions)
* Views(視圖)
### 建立CTE的WITH語句
允許為一個查詢結果建立別名,在後續查詢中引用別名去取得該查詢的結果集

```sql=
WITH CTE名稱 AS (
-- CTE定義的SQL查询
)
SELECT * FROM CTE名稱;
-- Example
WITH ManagerCTE AS (
SELECT DISTINCT e.manager_id, m.name
FROM employees e
INNER JOIN employees m ON e.manager_id = m.id
)
SELECT * FROM ManagerCTE;
```
* WITH語句內的查詢(如同子查詢一樣)會先執行,每個查詢的結果都會有一個暫存的臨時結果集,我們分別為這些臨時結果集取查詢別名。然後位於WITH語句之後的主查詢SELECT敘述就可以透過別名引用各該臨時結果集
#### 多個CTE
```sql=
WITH CTE名稱1 AS (
-- CTE1定義的SQL查询
), CTE名稱2 AS (
-- CTE2定義的SQL查询
)
SELECT * FROM CTE名稱1
JOIN CTE名稱2 ON CTE名稱1.某列 = CTE名稱2.某列;
--- Example
WITH SalesReps AS (
SELECT id, name
FROM employees
WHERE position = 'Sales Rep'
), SalesTotals AS (
SELECT sales_rep_id, SUM(amount) AS total_sales
FROM sales
GROUP BY sales_rep_id
)
SELECT s.name, st.total_sales
FROM SalesReps s
JOIN SalesTotals st ON s.id = st.sales_rep_id;
```
### 將查詢儲存為視圖(Views)
* 將查詢建立視圖存放在資料庫中。視圖是資料庫的一種物件,基本存放的是SQL語句。當引用視圖時,實際上是執行視圖所定義的SQL語句,動態生成一個結果集(虛擬表格),視圖的內容可以動態查出底層表格的當前資料。
```sql=
CREATE VIEW [資料庫結構名稱].[視圖名稱] AS
```

使用方式
```sql=
SELECT *
FROM farmers_market.vw_sales_by_day_vendow AS s
WHERE s.market_date BETWEEN '2020-04-01' AND '2020-04-30'
AND s.vendor_id = 7
ORDER BY market_date
```