2017-10-20 59 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;