Bonjour,

Je dois faire une requête assez complexe, je ne sais pas si quelqu'un pourra m'aider :

j'ai une table qui est de la forme ci dessous. Elle décrit des prévisions de prix pour des éléments par période:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
 
-----------------
|Prices		|
---------------------------------------------
|ElementId	|PeriodId	|  Prix	| DeviseId
---------------------------------------------
| 1		| 1	| 120	| 16
| 1		| 50	| 310	| 16
| 2		| 12	| 50	| 18

Et je voudrais faire un select qui effectue un report de ces prix dans le temps, c'est à dire obtenir :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
 
---------------------------------------------------------
|ElementId	|   PeriodId	|  Prix	|   DeviseId
---------------------------------------------------------
|  1		|  1		|  120	|  16
|  1		|  2		|  120	|  16
|  1		|  ...		|  120	|  16
|  1		|  49		|  120	|  16
|  1		|  50		|  310	|  16
|  1		|  ...		|  310	|  16
|  2		|  12		|  50	|  18
|  2		|  13		|  50	|  18
|  2		|  ...		|  50	|  18
J'y arrive bien sûr mais en faisant des sous-requêtes ce qui n'est pas très bon étant donné que ca concerne pas mal de lignes :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
 
SELECT
   Element.Id,
   Period.Id,
   (SELECT TOP 1 Prix FROM Prices 
    WHERE ElementId = Element.Id and PeriodId <= Period.Id ORDER BY PeriodId DESC) as Prix,
   (SELECT TOP 1 Devise FROM Prices 
    WHERE ElementId = Element.Id and PeriodId <= Period.Id ORDER BY PeriodId DESC) as Devise,
 
FROM
   Period cross join
   Element

Y'aurais-t-il un moyen plus efficace de faire ca ?

Merci d'avance!