我有两张桌子:
Employee
表格包含2列Name
和Sales
Rewards
表格包含2列Bonus
和Range
示例数据:
Employee Rewards
| Name | Sales | | Bonus | Range |
+------+-------+ +-------+-------+
| John | 112 | | 2 | 200 |
| Mary | 201 | | 3 | 300 |
| Joe | 400 | | 5 | 500 |
| Jack | 300 |
如果他的销售额< = Rewards.Range,每位员工都应该从Rewords表中获得奖励。
我想选择Employee.Name
和Rewards.Bonus
。
在这种情况下,结果应为:
| Name | Bonus |
+------+-------+
| John | 2 |
| Mary | 3 |
| Joe | 5 |
| Jack | 3 |
知道这个SQL查询会是什么吗?
谢谢, ZB
答案 0 :(得分:1)
我建议采用这种方法。可能存在一两个语法错误。
select name
, (select bonus from rewards
where range =
(select min(range)
from rewards
where range >= sales)
)
from employee
答案 1 :(得分:1)
我刚测试了这一个,它用你的测试表检索了正确的结果:
SELECT a.name,
MIN(b.bonus) AS bonus
FROM db.employee a
INNER JOIN db.rewards b
ON a.sales <= b.range
GROUP BY a.name;
答案 2 :(得分:0)
我会使用lag
获取每个范围的底部部分并将其加入员工的桌面:
SELECT name, bonus
FROM employee e
JOIN (SELECT bonus,
range AS top_range,
COALESCE(LAG(range) OVER (ORDER BY bonus ASC), 0) AS bottom_range
FROM rewards) r ON e.sales BETWEEN r.bottom_range AND r.top_range
答案 3 :(得分:0)
;with OrderedBonuses as (
select e.name, r.bonus, row_number() over (partition by e.name order by r.Range desc) as ord
from Employee e
JOIN Rewards r on e.Sales <= r.Range
)
select name, bonus
from OrderedBonuses
where ord = 1;