Bonjour,
J'ai bien conscience que le problème de sélectionner une ligne dont la date est, au choix, la plus grande, la plus petite, la plus proche par rapport à..., a déjà été évoqué maintes et maintes fois sur ce forum et je m'excuse déjà pour mon incompétence...
Cependant, je n'arrive pas à transposer les solutions vues sur différents sujets à mon propre problème.
Voilà ce qu'il en est.
Je dispose d'une table 'Tarifs' avec les différents tarifs de chacun de mes articles. Ces tarifs sont datés.
J'ai aussi une table 'ConcurrenceLignes' avec des prix provenant de devis concurrents. Eux aussi sont datés.
Voici le code des CREATE :
Un échantillon test :
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 DROP DATABASE IF EXISTS test; CREATE DATABASE test CHARACTER SET 'utf8'; USE test; CREATE TABLE IF NOT EXISTS test.Articles ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, code VARCHAR(10) NOT NULL, libelle VARCHAR(100) NOT NULL ) ENGINE = INNODB; CREATE TABLE IF NOT EXISTS test.Concurrents ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, nom VARCHAR(100) NOT NULL ) ENGINE = INNODB; CREATE TABLE IF NOT EXISTS test.ConcurrenceLignes ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, IDConcurrent INT NOT NULL, IDArticle INT NOT NULL, dateDevis DATE NOT NULL, prix NUMERIC(14,4) NOT NULL, CONSTRAINT fk_IDConcurrent FOREIGN KEY (IDConcurrent) REFERENCES Concurrents(ID), CONSTRAINT fk_IDArticle FOREIGN KEY (IDArticle) REFERENCES Articles(ID) ) ENGINE = INNODB; CREATE TABLE IF NOT EXISTS test.Tarifs ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, IDArticle INT NOT NULL, dateTarif DATE NOT NULL, prix NUMERIC(14,4) NOT NULL, CONSTRAINT fk_IDArticle FOREIGN KEY (IDArticle) REFERENCES Articles(ID) ) ENGINE = INNODB;
J'aimerais avoir, pour chacun de mes prix concurrents, le prix auquel nous vendions l'article au moment du devis.
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 INSERT INTO test.Articles (code, libelle) VALUES ('A', 'Article A'), ('B', 'Article B'), ('C', 'Article C'); INSERT INTO test.Concurrents (nom) VALUES ('Concurrent 1'), ('Concurrent 2'); INSERT INTO test.ConcurrenceLignes (IDConcurrent, IDArticle, dateDevis, prix) VALUES (1, 1, '20180101', 4.5), (1, 1, '20180301', 5.2), (1, 2, '20181005', 29.9), (2, 1, '20180501', 4.8), (2, 2, '20180320', 25.9), (2, 2, '20180420', 31.9), (2, 3, '20180615', 1510.41), (2, 3, '20180920', 1490.71); INSERT INTO test.Tarifs (IDArticle, dateTarif, prix) VALUES (1, '20180201', 4.9), (1, '20180504', 5.1), (1, '20180910', 5.4), (2, '20180112', 23.12), (2, '20180314', 22.4), (2, '20180725', 27.92), (2, '20181210', 31.45), (3, '20180411', 1575.45), (3, '20180813', 1603.37);
En clair, je dois extraire 'Tarif.prix' pour lequel 'ConcurrenceLignes.IDArticle' = 'Tarifs.IDArticle' et où 'Tarif.dateTarif' est la plus grande valeur inférieure à 'ConcurrenceLignes.dateDevis' et ce pour chaque ligne de 'ConcurrenceLignes'.
Voici une ébauche d'un SELECT... je vous passe la partie où j'essaye de joindre la date venant de Tarif. J'ai essayé de manipuler des sous-requêtes avec des MAX(), des HAVING... mais sans succès.
Pouvez-vous m'aider ?
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 SELECT A.code, A.libelle, C.nom, CL.dateDevis, CL.prix, T.dateTarif, T.prix FROM test.Articles AS A INNER JOIN test.ConcurrenceLignes AS CL ON A.ID = CL.IDArticle INNER JOIN test.Concurrents AS C ON C.ID = CL.IDConcurrent INNER JOIN test.Tarifs AS T ON A.ID = T.IDArticle WHERE -- Tarif dont la date est la plus grande inférieure à la date du devis pour cet article -- T.ID = ??
Merci beaucoup.
Partager