2010-06-29 4 views
1

Je ces deux tableaux:Choisissez parmi deux tables pour trouver le taux de TVA basé sur la date effective

 
mysql> desc vat_rates; 
+-------------+---------------+------+-----+---------+-------+ 
| Field  | Type   | Null | Key | Default | Extra | 
+-------------+---------------+------+-----+---------+-------+ 
| rate_id  | varchar(5) | NO | PRI | NULL |  | 
| name  | varchar(255) | NO |  | NULL |  | 
| type  | enum('O','I') | NO |  | NULL |  | 
| default  | tinyint(1) | YES |  | 0  |  | 
+-------------+---------------+------+-----+---------+-------+ 
6 rows in set (0.00 sec) 

mysql> desc vat_rates_details; 
+-------------+-------------+------+-----+---------+-------+ 
| Field  | Type  | Null | Key | Default | Extra | 
+-------------+-------------+------+-----+---------+-------+ 
| rate_id  | varchar(10) | NO |  | NULL |  | 
| effect_date | date  | NO |  | NULL |  | 
| rate  | float  | NO |  | NULL |  | 
+-------------+-------------+------+-----+---------+-------+ 
3 rows in set (0.00 sec) 

je besoin d'une requête qui me donne vat_rates.name, vat_rates.rate_id, vat_rates_details.rate où le effect_date est MAX() mais < = que maintenant(). Simplifiant, j'ai besoin de sélectionner tous les vat_rates avec le champ de taux étant la dernière date basée sur effect_date mais pas dans le futur.

exemple avec des données:

vat_rates:
rate_id = 'L9'
name = 'MyVatName'
type = 'O'
par défaut = 1

vat_rates_details (ligne 1):
rate_id = 'L9'
effect_date = '200 0-01-01'
rate = 20

vat_rates_details (ligne 2):
rate_id = 'L9'
effect_date = '01/06/2010'
rate = 19

vat_rates_details (ligne 3):
rate_id = 'L9'
effect_date = '01/07/2010'
rate = 21

Le résultat attendu:

 
+-------------+-------------+------+ 
| rate_id  | name  | rate | 
+-------------+-------------+------+ 
| L9   | MyVatName | 19 | 
+-------------+-------------+------+ 

Merci pour votre temps :)

EDIT: Taux attendu est de 19 pas 20. TKS Justin.

+0

ne sont pas vous attendent à un taux de 19 au lieu de 20? –

+0

Vous avez raison Justin ma mauvaise. – mjsilva

Répondre

1
select rd.rate_id, r.name, rd.rate 
from (
    select rate_id, max(effect_date) as MaxEffectDate 
    from vat_rates_details 
    where effect_date < now() 
    group by rate_id 
) rdm 
inner join vat_rates_details rd on rdm.rate_id = rd.rate_id and rdm.MaxEffectDate = rd.effect_date 
inner join vat_rates r on rd.rate_id = r.rate_id 
+0

si vous ajoutez rd.rate à la première partie de la sélection, cela renverra vos résultats souhaités –

0

Autres méthodes possibles:

SELECT 
    VR.name, 
    VR.rate_id, 
    VRD1.rate 
FROM 
    Vat_Rates VR 
INNER JOIN Vat_Rate_Details VRD1 ON 
    VRD1.rate_id = VR.rate_id AND 
    VRD1.effect_date < NOW()  -- Is this the correct syntax for mySQL? 
LEFT OUTER JOIN Vat_Rate_Details VRD2 ON 
    VRD2.rate_id = VR.rate_id AND 
    VRD2.effect_date < NOW() AND 
    VRD2.effect_date > VRD1.effect_date 

SELECT 
    VR.name, 
    VR.rate_id, 
    VRD1.rate 
FROM 
    Vat_Rates VR 
INNER JOIN Vat_Rate_Details VRD1 ON 
    VRD1.rate_id = VR.rate_id AND 
    VRD1.effect_date < NOW() 
WHERE NOT EXISTS 
(
    SELECT * 
    FROM Vat_Rate_Details VRD2 
    WHERE 
     VRD2.rate_id = VR.rate_id AND 
     VRD2.effect_date < NOW() AND 
     VRD2.effect_date > VRD1.effect_date 
) 
Questions connexes