Bonjour,
Je travaille actuellement sur une base de données qui traite les données achats d'une entreprise. Pour simplifier la chose mon problème concerne 4 tables que voici :
- Receip
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 CREATE TABLE `receip` ( `re_num` int(10) unsigned NOT NULL AUTO_INCREMENT, `re_date` date NOT NULL, `re_qty` double(15,5) NOT NULL, `re_purite` int(10) unsigned NOT NULL, PRIMARY KEY (`re_num`), KEY `re_purite` (`re_purite`), CONSTRAINT `receip_ibfk_1` FOREIGN KEY (`re_purite`) REFERENCES `purite` (`pi_num`) ) ENGINE=InnoDB AUTO_INCREMENT=532679 DEFAULT CHARSET=latin1; INSERT INTO receip VALUES(null,'2010-01-04',500,1); INSERT INTO receip VALUES(null,'2010-01-04',500,1); INSERT INTO receip VALUES(null,'2010-01-04',1000,3); INSERT INTO receip VALUES(null,'2010-01-04',10,2); INSERT INTO receip VALUES(null,'2010-01-05',50,4); INSERT INTO receip VALUES(null,'2010-01-05',10000,4); INSERT INTO receip VALUES(null,'2010-01-05',5000,3); INSERT INTO receip VALUES(null,'2010-01-08',3000,2); INSERT INTO receip VALUES(null,'2010-01-08',3000,5); INSERT INTO receip VALUES(null,'2010-01-08',3000,4); INSERT INTO receip VALUES(null,'2010-01-08',3000,2); INSERT INTO receip VALUES(null,'2010-01-10',2500,2); INSERT INTO receip VALUES(null,'2010-01-14',50000,1);- Purite
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 CREATE TABLE `purite` ( `pi_num` int(10) unsigned NOT NULL AUTO_INCREMENT, `pi_price` double(16,10) NOT NULL, `pi_item` char(18) NOT NULL, PRIMARY KEY (`pi_num`), KEY `pi_item` (`pi_item`), CONSTRAINT `purite_ibfk_1` FOREIGN KEY (`pi_item`) REFERENCES `item` (`it_code`) ) ENGINE=InnoDB AUTO_INCREMENT=75777 DEFAULT CHARSET=latin1; INSERT INTO purite VALUES(1,1.52,'A120152'); INSERT INTO purite VALUES(2,2.52,'A158751'); INSERT INTO purite VALUES(3,0.00214,'A203542'); INSERT INTO purite VALUES(4,0.0034,'A203542'); INSERT INTO purite VALUES(5,9.54,'A205845');- Item
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 CREATE TABLE `item` ( `it_code` char(18) NOT NULL, `it_name` char(70) NOT NULL PRIMARY KEY (`it_code`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; INSERT INTO item VALUES('A120152','Resistance'); INSERT INTO item VALUES('A158751','Condensateur'); INSERT INTO item VALUES('A203542','relais'); INSERT INTO item VALUES('A205845','Resistance 2');- Foreca
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 CREATE TABLE `foreca` ( `fc_item` char(18) NOT NULL DEFAULT '' `fc_year` year(4) NOT NULL, `fc_qty` int(10) unsigned NOT NULL, PRIMARY KEY (`fc_item`,`fc_geosit`), KEY `foreca_ibfk_2` (`fc_geosit`), CONSTRAINT `foreca_ibfk_1` FOREIGN KEY (`fc_item`) REFERENCES `item` (`it_code`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; INSERT INTO foreca VALUES('A120152','2010',800000); INSERT INTO foreca VALUES('A158751','2010',950000); INSERT INTO foreca VALUES('A203542','2010',1510000); INSERT INTO foreca VALUES('A205845','2010',15000);
Pour faire simple, je veux comparer mes prévisions (qui sont annuelles) à mes réceptions par mois en 2010.
Voila ma requete pour avoir les réception par mois (et qui fonctionne très bien) :
Le souci est pour intégrer les prévisions car :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 SELECT Date_format(re_date, 'M %Y %m') AS interv, SUM(re_qty) AS qty FROM receip, purite WHERE ( re_date BETWEEN '2010-01-01' AND '2010-12-31' ) AND re_purite = pi_num GROUP BY interv ORDER BY interv
- il y a une quantité prévisionnelle par article (item) et par an
- il peut ( et même il y a très souvant) plusieurs réceptions d'un même article dans un mois
Donc si je fais la requête suivante, il va m'ajouter les prévisions pour un même article réceptionné plusieurs fois. J'espère être clair
Ce que je veux c'est que dans les calculs de la requête il ne compte qu'une seule fois la prévision même si l'article apparaît plusieurs fois dans la table receip.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 SELECT date_format(re_date,'M %Y %m') as interv, sum(re_qty) as qty, sum(fc_qty / 12) as forecast FROM receip,purite,foreca WHERE (re_date between '2010-01-01' and '2010-12-31') and re_purite = pi_num and (fc_item = pi_item and year(re_date) = '2010') GROUP BY interv ORDER BY interv
Je ne veux pas ça :
mais ça :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 interv qty forecast --------- ----- ------------ M 2010 01 81560 1147083.3333
Merci d'avance
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 interv qty forecast --------- ----- ------------ M 2010 01 81560 272916.6667
Partager