2011-12-14 4 views
2

j'ai ces tables:comment trouver un enregistrement entre une date de gamme

tableau 1:

date  | idcurrency | total 
2011-10-11 |  1  | 100 
2011-10-14 |  1  | 500 
2011-10-12 |  2  | 200 
2011-11-01 |  2  | 100 

Tableau 2

idcurrency | value | date 
     1  | 200 | 2011-10-09 
     1  | 350 | 2011-10-15 
     2  | 200 | 2011-10-09 
     2  | 250 | 2011-10-20 

J'ai besoin de calculer une nouvelle total basé sur la multiplication du champ total du table 1 , avec le champ valeur du table 2. Table 2 conserver les modifications sur la valeur monétaire et n'est pas la date continious, donc je ne peux pas comprendre comment joindre ces tables pour obtenir mon objectif


Changer la conception

Je pensais dans le changement la conception de table2, l'ajout d'un nouveau champ pour enregistrer la date limite de la fourchette pour la valeur de la monnaie, comme ceci:

idcurrency | value | start_date | end_date 
    1  200  2011-10-09  2011-10-14 
    1  350  2011-10-15  2011-12-14 
    2  200  2011-10-09  2011-10-19 
    2  250  2011-10-20  2011-12-14 

Ensuite, je pourrais rejoindre Table1 et Table2 sans utiliser "appliquer externe", mais maintenant j'essaie de faire une requête pour ajouter ce nouveau champ

Merci !!

+0

Qu'ont tu as essayé? Avez-vous une requête qui, selon vous, devrait fonctionner, mais ce n'est pas le cas? –

+0

Avez-vous le contrôle sur la conception des tables ou sont-elles fixes? – dasblinkenlight

+0

Je n'ai aucun contrôle sur la conception, mais si je crée une solution avec une meilleure performance que la solution «outter apply», je pourrais demander un changement dans la conception que je pensais changer la conception de table2, en ajoutant un nouveau champ à enregistrer la date finale de la plage pour la valeur de la monnaie, comme ci-dessus. Ensuite, je pourrais rejoindre ces tables sans l'utilisation d'une "application externe", améliorant les performances de la requête –

Répondre

1

Vous pouvez utiliser un sous-requête outer apply pour rechercher la dernière valeur d'une monnaie:

select t1.* 
,  last_value.Value * t1.total 
from Table1 t1 
outer apply 
     (
     select top 1 value 
     from Table2 t2 
     where t2.idcurrency = t1.idcurrency 
       and t2.date <= t1.date 
     order by 
       t2.date desc 
     ) last_value 
+0

fonctionne parfaitement !! Merci –

0

ce que quelque chose comme ci-dessous (je ne pas testé):

SELECT *,total*value as Total 
FROM Table1 INNER JOIN (SELECT idCurrency,max(date) as value 
GROUP BY idCurrency,date) 
ON table1.idcurrency = table2.currency 
Questions connexes