Bonjour les internautes,
Je dispose d'une table, appelons là Subjects pour laquelle je voudrais vérifier l'existence d'une vente dans une table que nous appellerons Sales
Voici le code de la création de mon exemple :
Populons ces tables avec quelques données :
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 CREATE TABLE IF NOT EXISTS Subjects ( id INT UNSIGNED NOT NULL AUTO_INCREMENT, subject VARCHAR(50), option1 NUMERIC, option2 NUMERIC, option3 NUMERIC, PRIMARY KEY (ID) ); CREATE TABLE IF NOT EXISTS Sales ( id INT UNSIGNED NOT NULL AUTO_INCREMENT, subject VARCHAR(50), sale NUMERIC, dateSale DATE, PRIMARY KEY (ID) );
Mon but est de savoir, pour chaque Subject, quelle est l'option qu'on lui a choisis, et savoir si oui ou non on l'a vendu à partir d'une date donnée.
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 INSERT INTO Subjects VALUES (NULL, 'A', 1, 0, 0), (NULL, 'B', 2, 0, 0), (NULL, 'C', 0, 10, 0), (NULL, 'D', 0, 20, 0), (NULL, 'E', 0, 30, 0), (NULL, 'F', 0, 40, 0), (NULL, 'G', 0, 0, 100), (NULL, 'H', 0, 0, 200), (NULL, 'I', 0, 0, 300), (NULL, 'J', 1, 10, 0), (NULL, 'K', 1, 0, 100), (NULL, 'L', 0, 10, 100); INSERT INTO Sales VALUES (NULL, 'A', 25, '2019-02-12 00:00:00'), (NULL, 'A', 10, '2020-04-20 00:00:00'), (NULL, 'C', 15, '2019-03-15 00:00:00'), (NULL, 'C', 42, '2019-05-17 00:00:00'), (NULL, 'C', 75, '2019-10-10 00:00:00'), (NULL, 'D', 12, '2020-06-07 00:00:00'), (NULL, 'E', 29, '2019-02-12 00:00:00'), (NULL, 'F', 77, '2020-05-14 00:00:00'), (NULL, 'F', 88, '2020-11-12 00:00:00'), (NULL, 'K', 99, '2018-09-30 00:00:00');
Ensuite, j'utilise des fonctions d'aggrégation pour compter le nombre de Subjets de chaque option et son statut de vente.
Le résultat doit ressemble à ça :
Les unknown désignent les Subjects avec plusieurs options complétées.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 +---------+-------+---------+ | choice | saled | nbr_sub | +---------+-------+---------+ | option1 | 1 | 1 | | option1 | 0 | 1 | | option2 | 0 | 2 | | option2 | 1 | 2 | | option3 | 0 | 3 | | unknown | 0 | 3 | +---------+-------+---------+
Pour arriver à ce résultat, j'ai utilisé la requête suivante :
Celle-ci fonctionne à merveille sur serveur MySQL. Mais une fois adaptée à ma DB de production DB2, ça coince.
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 SELECT s.opt, s.saled, COUNT(s.id) AS nbr_sub FROM ( SELECT su.id, su.subject, CASE WHEN su.option1 <> 0 AND su.option2 = 0 AND su.option3 = 0 THEN 'option1' WHEN su.option1 = 0 AND su.option2 <> 0 AND su.option3 = 0 THEN 'option2' WHEN su.option1 = 0 AND su.option2 = 0 AND su.option3 <> 0 THEN 'option3' ELSE 'unknown' END AS opt, EXISTS ( SELECT 1 FROM Sales AS sa WHERE sa.subject = su.subject AND YEAR(sa.dateSale) > 2019 ) AS saled FROM Subjects AS su ) AS s GROUP BY s.opt, s.saled
Le soucis semble venir de la sous-requête du EXISTS dans le SELECT. En effet, j'y fait référence à une table de la requête parent. Cependant, le FROM se situe après le SELECT et je suspecte que ce soit la cause de mon malheur. Parce que la même requête avec le EXISTS dans la clause WHERE me donne un résultat.
Quelque chose comme ceci :
Pouvez-vous m'aider à résoudre ce casse-tête ?
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 SELECT s.opt, -- s.saled, COUNT(s.id) AS nbr_sub FROM ( SELECT su.id, su.subject, CASE WHEN su.option1 <> 0 AND su.option2 = 0 AND su.option3 = 0 THEN 'option1' WHEN su.option1 = 0 AND su.option2 <> 0 AND su.option3 = 0 THEN 'option2' WHEN su.option1 = 0 AND su.option2 = 0 AND su.option3 <> 0 THEN 'option3' ELSE 'unknown' END AS opt FROM Subjects AS su ) AS s WHERE EXISTS ( SELECT 1 FROM Sales AS sa WHERE sa.subject = s.subject AND YEAR(sa.dateSale) > 2019 ) GROUP BY s.opt
Je vous remercie.
Partager