2017-10-20 9 views
3

J'ai 2 tables:SQL - trouver la valeur entre les lignes

  • Employee table avec 2 colonnes Name et Sales
  • Rewards table avec 2 colonnes Bonus et Range

données de l'échantillon:

Employee      Rewards 

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

Chaque employé mérite un bonus de la table Rewords si ses ventes < = Rewards.Range.

Je veux sélectionner Employee.Name et Rewards.Bonus.

Dans ce cas, le résultat devrait être:

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

Toute idée de ce que cette requête SQL sera?

Merci, ZB

+0

Qu'est-ce que [tag: rdbms] utilisez-vous? – Mureinik

+0

J'utilise le serveur SQL –

+0

Peut-être que cela? 'Select name, bonus de de l'employé, les récompenses où les ventes <= plage groupe par nom ayant min (plage); ' – tonypdmtr

Répondre

1

je suggère cette approche. Il peut y avoir une erreur de syntaxe ou deux.

select name 
, (select bonus from rewards 
where range = 
(select min(range) 
from rewards 
where range >= sales) 
) 
from employee 
0

J'utilise lag pour obtenir la partie partie inférieure de chaque plage et rejoindre sur la table de l'employé:

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

Si je comprends bien, BETWEEN signifie PLUS GRAND ÉGAL à partir du bas et MOINS ÉGAL à partir du haut. Lorsque les ventes = 200, il remplira les conditions entre 0 et 200 et entre 200 et 300. Devrais-je ajouter "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

Je viens de tester celui-ci dehors et récupérai le droit résultats avec vos tables de test:

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;