# 🧹 B26｜销售明细清洗前后对比说明

> **配套文件**：`清洗查询_zh.pq`
> **数据源**：`数据源_销售明细_sample.csv`
> **目标表**：`RawData`（Excel 中按 `Ctrl+T` 建表后命名）

本文逐行说明每一步 M 查询做了什么、用到了哪些核心函数、改了哪些脏数据。

---

## 1. 原始数据（清洗前）

`RawData` 表 6 列 14 行，故意保留典型脏数据：

| 订单号 | 客户姓名 | 地区 | 销售额 | 折扣 | 备注 |
|---|---|---|---|---|---|
| D001 | **" 张三 "** | 华东 | **"¥1,200"** | **"12% "** | 老客户 |
| D002 | 李四 | **" 华北 "** | ¥8,500 | 25% | 促销 |
| D003 | **" 王五  "** | 华南 | **"¥15,300 "** | **"5% "** | 大单 |
| D004 | 赵六 | 华东 | ¥3,400 | 30% | 复购 |
| ... | ... | ... | ... | ... | ... |

四类典型脏点：
1. **多余空格**：客户姓名 `" 张三 "`、地区 `" 华东 "`；
2. **货币符号 + 千分位**：销售额写成 `"¥1,200"`（带 `¥` 和逗号）；
3. **百分号文本**：折扣 `"12%"` 是文本而非数字；
4. **不必要列**：备注列直接删。

---

## 2. 每步干了啥（M 代码拆解）

| 步骤 | M 代码片段 | 做了什么 | 关键函数 |
|---|---|---|---|
| 1 | `Source = Excel.CurrentWorkbook(){[Name="RawData"]}[Content]` | 从当前工作簿读名为 `RawData` 的表 | `Excel.CurrentWorkbook` |
| 2 | `KeepCols = Table.SelectColumns(Source, {"订单号","客户姓名","地区","销售额","折扣"})` | 白名单选列，丢掉"备注" | `Table.SelectColumns` |
| 3 | `TrimText = Table.TransformColumns(KeepCols, {{"地区", each Text.Upper(Text.Trim(_)), type text}, ...})` | 地区去空格 + 大写；客户姓名去空格 | `Table.TransformColumns` + `Text.Trim` + `Text.Upper` |
| 4 | `ToNumber = Table.TransformColumns(TrimText, {{"销售额", each Number.FromText(Text.Remove(_, {"¥",","," "})), ...}, ...})` | 删符号再转数字 | `Text.Remove` + `Number.FromText` |
| 5 | `CalcCommission = (sales, discount) => if discount > 20 then sales*0.03 else sales*0.05` | 自定义函数：提成规则 | `=>` 自定义函数语法 |
| 6 | `AddCommission = Table.AddColumn(ToNumber, "提成", each CalcCommission([销售额],[折扣]), type number)` | 每行调用 `CalcCommission` 加一列 | `Table.AddColumn` + `each` + `[列名]` |
| 7 | `AddLevel = Table.AddColumn(AddCommission, "等级", each if [销售额]>=10000 then "A" else if ...)` | 按销售额打 A/B/C 标签 | 嵌套 `if...then...else` |
| 8 | `Result = Table.ReorderColumns(AddLevel, {...})` | 列顺序重排，方便看 | `Table.ReorderColumns` |

---

## 3. 清洗后（输出表）

| 订单号 | 客户姓名 | 地区 | 销售额 | 折扣 | 提成 | 等级 |
|---|---|---|---|---|---|---|
| D001 | 张三 | 华东 | 1200 | 12 | 60 | B |
| D002 | 李四 | 华北 | 8500 | 25 | 255 | B |
| D003 | 王五 | 华南 | 15300 | 5 | 765 | A |
| D004 | 赵六 | 华东 | 3400 | 30 | 102 | C |
| D005 | 钱七 | 华北 | 6700 | 18 | 335 | B |
| D006 | 孙八 | 华东 | 9200 | 15 | 460 | B |
| D007 | 周九 | 华南 | 22800 | 28 | 684 | A |
| D008 | 吴十 | 华北 | 4500 | 8 | 225 | C |
| D009 | 郑十一 | 华东 | 11600 | 22 | 348 | A |
| D010 | 王十二 | 华南 | 7800 | 16 | 390 | B |
| D011 | 刘十三 | 华东 | 2900 | 10 | 145 | C |
| D012 | 陈十四 | 华北 | 18500 | 33 | 555 | A |
| D013 | 杨十五 | 华南 | 5400 | 14 | 270 | B |
| D014 | 黄十六 | 华东 | 3100 | 19 | 155 | C |

具体改了什么：
- " 张三 " → **张三**（去掉首尾空格）；
- " 华东 " / " 华北 " → **华东 / 华北**（去掉空格+统一大写）；
- "¥1,200" → **1200**（去掉 `¥`、`,`、空格，再转数字）；
- "12% " → **12**（去掉 `%`、空格，再转数字）；
- 新增 **提成** 列（按规则自动算）；
- 新增 **等级** 列（销售额 ≥10000 = A，≥5000 = B，其余 C）；
- **删除"备注"列**，列顺序按业务习惯调整。

---

## 4. 想要"再加点东西"怎么改

| 想做的事 | 在 M 代码哪里改 | 改法示例 |
|---|---|---|
| 折扣规则改 25% | 第 5 步 `if discount > 20` | 改成 `if discount > 25` |
| 提成比例改 4% / 6% | 第 5 步 `sales*0.03` / `sales*0.05` | 改成 `sales*0.04` / `sales*0.06` |
| 等级阈值改成 8000 / 3000 | 第 7 步 `if [销售额]>=10000` | 改成 `if [销售额]>=8000` 等 |
| 再加一列"折扣金额" | 在第 8 步前插入一行 | `AddDiscountAmt = Table.AddColumn(AddLevel, "折扣金额", each [销售额]*[折扣]/100, type number)` |
| 多列同时选 | 第 2 步白名单 | `Table.SelectColumns(Source, {"订单号", "客户姓名", "地区", "销售额", "折扣", "提成", "等级"})` |

---

## 5. 给 AI 复盘的提示词

```
这是我的 Power Query M 查询：
{粘贴清洗查询_zh.pq 全文}

请帮我：
1. 用大白话逐行解释每一步在做什么；
2. 找出可能报错的 3 个点（比如列名拼写、Number.FromText 是否能识别）；
3. 我想把规则"折扣 > 25% 提成 4%，否则 6%"改进去，请给我改好的版本（保留中文注释）。
```

---

> 📌 **核验清单**：
> - [ ] Excel 表名 = `RawData`（大小写一致）；
> - [ ] 列名 `订单号 / 客户姓名 / 地区 / 销售额 / 折扣` 与代码逐字一致；
> - [ ] 粘贴完点"完成"预览正常，没报红字；
> - [ ] 关闭并上载后，新表行数 = 14 行，列数 = 7 列；
> - [ ] 提成/等级列按规则计算正确（自己抽 2 行手算对一下）。