2017-10-20 65 views
3

之间的值我有2个表:SQL - 找到行

  • Employee表2列NameSales
  • Rewards 2列BonusRange

样品数据表:

Employee      Rewards 

| Name | Sales |    | Bonus | Range | 
+------+-------+    +-------+-------+ 
| John | 112 |    | 2  | 200 | 
| Mary | 201 |    | 3  | 300 | 
| Joe | 400 |    | 5  | 500 | 
| Jack | 300 | 

如果他的销售< = Rewards.Range,每位员工都应该从Rewords表中获得奖金。我想选择Employee.NameRewards.Bonus

在这种情况下,结果应该是:

| Name | Bonus | 
+------+-------+ 
| John | 2  | 
| Mary | 3  | 
| Joe | 5  | 
| Jack | 3  | 

任何想法,这个SQL查询将是什么?

感谢, ZB

+0

您使用了什么[标签:rdbms]? – Mureinik

+0

我正在使用SQL服务器 –

+0

也许这样? 'select name,bonus from员工,奖励 销售<=范围 集团的名称 有最小(范围); ' – tonypdmtr

回答

1

我建议这种方法。可能有一个或两个语法错误。

select name 
, (select bonus from rewards 
where range = 
(select min(range) 
from rewards 
where range >= sales) 
) 
from employee 
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 
+0

据我所知,BETWEEN意味着从底部开始GREATER EQUAL较高,而从顶部开始LESS EQUAL较低。当销售额= 200时,它将满足0到200之间和200到300之间的条件。我应该添加“AND e.sales> r.bottom? –

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; 
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;