Bonjour,
J'ai une table COMMANDES de la forme suivante :
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 | COMMANDE | ARTICLE | QTE | --------------------------- | 1 | ART1 | 5 | | 2 | ART1 | 15 | | 3 | ART1 | 25 | ---------------------------
La table catégorie est une vue et n'a pas d'index
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 | ---------------------------
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:
Pour cela j'ai écrit la procédure stockée suivante :2 | ART1 | 15 | 5 | 20
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.
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
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.
Partager