如何基于类别与值范围从另一表获取对应积分
问题:根据积分规则匹配生成积分列
需求说明
需要将主表(Sales)中的Revenue、Profit数值,与积分表(Point)的区间规则比对,生成对应的Revenuepoint、Profitpoint积分列。匹配规则如下:
- 必须匹配Department和BU
Revenuepoint对应积分表中Category='Revenue'的区间规则Profitpoint对应积分表中Category='Profit'的区间规则
主表(Sales)
| User | Department | BU | Revenue | Revenuepoint | Profit | Profitpoint |
|---|---|---|---|---|---|---|
| A | 1000000 | 101 | 400 | 200 | ||
| B | 1000001 | 101 | 300 | 40 | ||
| C | 1000000 | 102 | 350 | 150 |
积分表(Point)
| Category | Department | BU | Fromvalue | Tovalue | Point |
|---|---|---|---|---|---|
| Revenue | 1000000 | 101 | 0 | 200 | 1 |
| Revenue | 1000000 | 101 | 201 | 400 | 2 |
| Revenue | 1000000 | 102 | 0 | 300 | 1 |
| Revenue | 1000000 | 102 | 301 | 400 | 2 |
| Revenue | 1000001 | 101 | 0 | 200 | 1 |
| Revenue | 1000001 | 101 | 201 | 400 | 2 |
| Profit | 1000000 | 101 | 0 | 100 | 1 |
| Profit | 1000000 | 101 | 101 | 300 | 2 |
| Profit | 1000000 | 102 | 0 | 50 | 1 |
| Profit | 1000000 | 102 | 51 | 200 | 2 |
| Profit | 1000001 | 101 | 0 | 50 | 1 |
| Profit | 1000001 | 101 | 51 | 200 | 2 |
预期结果表
| User | Department | BU | Revenue | Revenuepoint | Profit | Profitpoint |
|---|---|---|---|---|---|---|
| A | 1000000 | 101 | 400 | 2 | 200 | 2 |
| B | 1000001 | 101 | 300 | 2 | 40 | 1 |
| C | 1000000 | 102 | 350 | 2 | 150 | 2 |
问题代码分析
你尝试的代码缺少Department、BU和Category的匹配条件,会导致区间匹配错误,同时重复定义了Revenuepoint列,存在语法问题:
SELECT a.User, a.Department, a.BU, a.Revenue, (SELECT MAX(b.Point) from Point b WHERE a.Revenue BETWEEN b.fromvalue and b.tovalue) as Revenuepoint, b.Point as Revenuepoint, a.Profit, (SELECT MAX(b.Point) from Point b WHERE a.Profit BETWEEN b.fromvalue and b.tovalue) as Profitpoint FROM Sales a
正确解决方案
方案1:关联子查询
针对每个积分列,在子查询中加上完整的匹配条件,确保只匹配对应分类、部门和BU的区间规则:
SELECT a.User, a.Department, a.BU, a.Revenue, ( SELECT b.Point FROM Point b WHERE b.Category = 'Revenue' AND a.Department = b.Department AND a.BU = b.BU AND a.Revenue BETWEEN b.Fromvalue AND b.Tovalue ) AS Revenuepoint, a.Profit, ( SELECT b.Point FROM Point b WHERE b.Category = 'Profit' AND a.Department = b.Department AND a.BU = b.BU AND a.Profit BETWEEN b.Fromvalue AND b.Tovalue ) AS Profitpoint FROM Sales a;
方案2:LEFT JOIN关联
通过两次LEFT JOIN分别关联Revenue和Profit的积分规则,逻辑更直观:
SELECT a.User, a.Department, a.BU, a.Revenue, rev.Point AS Revenuepoint, a.Profit, prof.Point AS Profitpoint FROM Sales a LEFT JOIN Point rev ON rev.Category = 'Revenue' AND a.Department = rev.Department AND a.BU = rev.BU AND a.Revenue BETWEEN rev.Fromvalue AND rev.Tovalue LEFT JOIN Point prof ON prof.Category = 'Profit' AND a.Department = prof.Department AND a.BU = prof.BU AND a.Profit BETWEEN prof.Fromvalue AND prof.Tovalue;
内容的提问来源于stack exchange,提问作者John Marston
相关产品推荐
相关产品推荐

