Bonjour,

J'ai une table COMMANDES de la forme suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
 
| COMMANDE | ARTICLE | QTE |
---------------------------
|  1       | ART1    | 5   |
|  2       | ART1    | 15  |
|  3       | ART1    | 25  | 
---------------------------
J'ai une table CATEGORIE de catégories de prix qui va dire que si on achète entre 0 et 5 articles on paye tel prix, entre 5 et 20 tel prix et plus de 20 un autre prix.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
 
| C_ARTICLE | C_QTE | PRIX |
---------------------------
| ART1      | 0     | 3    |
| ART1      | 5     | 2    |
| ART1      | 20    | 1    |
---------------------------
La table catégorie est une vue et n'a pas d'index

Je voudrais pour chaque ligne de commande avoir la borne inférieure et la borne suppérieur de la catégorie de prix de l'article en fonction de la quantité commandée.

Par exemple, si la quantité commandée est 4, la borne inférieure est 0 et la borne supérieure 5. Si la quantité est 20, la borne inférieur et la borne supérieure est 20.

J'aurais comme résultat par exemple:
2 | ART1 | 15 | 5 | 20
Pour cela j'ai écrit la procédure stockée suivante :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
 
ALTER PROCEDURE [dbo].[stat] 
	--@codart varchar(30)
 
AS
-- table variable pour stockage resultat
    DECLARE @reports TABLE 
	(
	commande varchar(20), 
	article varchar(30), 
	quantite numeric(28,12), 
	qteup numeric(28,12),
	qtedown numeric(28,12)
	)
 
	DECLARE
	@commande varchar(20), 
	@article varchar(30)
 
BEGIN
	SET NOCOUNT ON;
 
-- on transpose dans les colonne de la table temporaire les lignes de la requête dans stats_ps
	INSERT INTO @reports
		SELECT
		commande, 
		article, 
		quantite, 
		qteup,
		qtedown
		FROM
		COMMANDES
 
 
 
	 DECLARE Q0 CURSOR FOR 
	 SELECT commande, article FROM @reports
	 OPEN Q0 
	 FETCH NEXT FROM Q0 INTO @commande, @article
	 WHILE (@@FETCH_STATUS = 0)
		  BEGIN 
			UPDATE @reports
			SET qtedown = (  -- on veut récupérer la valeur basse de la catégorie de prix
					SELECT
					   max(C_QTE)
					FROM
					   CATEGORIE 
					WHERE 
					  C_ARTICLE = @article 
					  and C_QUANTITE <= @quantite)
			WHERE
				commande = @commande
				and article = @article
 
			UPDATE @reports
			SET qteup = (   --  on veut récupérer la valeur haute de la catégorie de prix
					SELECT
					   min(C_QTE)
					FROM
					   CATEGORIE
					WHERE
					   C_ARTICLE = @article 
					and C_QUANTITE >= (case when @quantite > (select     --si la quantite commande est plus grande que la plus grande des quantités de la catégorie
		max(C_QTE) 
		from CATEGORIE 
		where C_ARTICLE = @article) 
	then (select             -- alors on prend la plus grande quantité de la catégorie pour valeur de qteup
	        max(C_QTE)
	       from CATEGORIE 
	        where C_ARTICLE = @article)
	else @quantite            -- sinon on compare avec la quantité de la commande
	end)
						)
			WHERE
				and commande = @commande
				and article = @article
		  -- suivant
		  FETCH NEXT FROM Q0 INTO @commande, @article
	 END
	 CLOSE Q0
	 DEALLOCATE Q0 
 
 
END
 
SELECT 
	*
FROM
	@reports
J'avoue que le deuxième update est pas très propre mais même si je l'enlève, je me retrouve avec un temps d'execution très long.

Pour avoir une idée, avec 6000 lignes dans la table COMMANDES (qui ne concernent qu'un seul article) et 150 lignes dans la table CATEGORIE (dont 5 ligne concernant l'article de la table COMMANDE), je dois attendre 20 mn pour avoir le résultat.

Et en fait ma table COMMANDES contient 45000 lignes et environ 140 articles....

Auriez-vous une idée pour optimiser ce code?

Merci.