如何根据发票日期、发票编号及类别生成新类别?
问题解决:生成符合规则的新类别字段
原数据表格
| 日期 | 发票编号 | 类别 |
|---|---|---|
| 30-09-2024 | 1 | VSS |
| 1-10-2024 | 2 | RSS |
| 1-10-2024 | 3 | VSS |
| 1-10-2024 | 3 | RSS |
| 1-10-2024 | 4 | RSS |
| 1-10-2024 | 4 | RSS |
目标结果表格
| 日期 | 发票编号 | 类别 | 新类别 |
|---|---|---|---|
| 30-09-2024 | 1 | VSS | VSS |
| 1-10-2024 | 2 | RSS | RSS |
| 1-10-2024 | 3 | VSS | VSS |
| 1-10-2024 | 3 | RSS | VSS |
| 1-10-2024 | 4 | RSS | RSS |
| 1-10-2024 | 4 | RSS | RSS |
规则说明
- 同一日期+发票编号组合下存在不同类别时,该组合所有记录的新类别统一为
VSS - 同一日期+发票编号组合下类别唯一时,新类别保留原类别
你尝试的错误SQL
SELECT Date, BillNo, Category , case when [Category]='VSS' then 'VSS' else 'RSS' end [New CATEGORY] FROM TBL
该SQL仅判断当前行的类别,未考虑同一分组内的其他行数据,因此无法满足需求。
正确的SQL实现
方法1:使用窗口函数(推荐)
通过窗口函数统计每个分组内的不同类别数量,再据此判断新类别:
SELECT Date, BillNo, Category, CASE WHEN COUNT(DISTINCT Category) OVER (PARTITION BY Date, BillNo) > 1 THEN 'VSS' ELSE Category END AS [New CATEGORY] FROM TBL
PARTITION BY Date, BillNo:按日期和发票编号分组,将同一日期同一发票的记录归为一组COUNT(DISTINCT Category) OVER (...):统计每组内不同类别的数量- 数量大于1时说明分组内存在多类别,新类别设为
VSS;否则直接使用原类别
方法2:子查询关联(兼容不支持窗口函数DISTINCT的场景)
先通过子查询统计每个分组的类别数量,再关联原表生成结果:
SELECT t.Date, t.BillNo, t.Category, CASE WHEN c.CategoryCount > 1 THEN 'VSS' ELSE t.Category END AS [New CATEGORY] FROM TBL t JOIN ( SELECT Date, BillNo, COUNT(DISTINCT Category) AS CategoryCount FROM TBL GROUP BY Date, BillNo ) c ON t.Date = c.Date AND t.BillNo = c.BillNo
内容的提问来源于stack exchange,提问作者user27948302
相关产品推荐
相关产品推荐

