Bonjour,
Voici un problème qui m'embête depuis longtemps et auquel je ne trouve pas de solutions. Je pense pourtant qu'il y en a une et que c'est la construction de ma requête qui pose problème.
Le contexte :
J'ai une base qui date de plus de 10 ans et qui sert à récolter des chiffres d'affaires de mon entreprises et autres (genre ERP)
Le premier problème est que cette base a mal été conçue à l'origine et qu'elle n'est pas documentée, pas de clés étrangères, pas de schémas (250 tables) et les relations entres les tables ne sont pas claires.
Ensuite la couche php (4) est passée entre plusieurs mains sans documentation dans le code et surtout aucune sécurité n'a été mise en place pour éviter de polluer la base (genre filtre sur les mails, les numéros de tél), voir faire des injections sql -> bref elle est pourrie, et nous nous en dégageons peu à peu pour nous tourner vers un CRM et un vrai ERP, mais cela est un processus long et coûteux, il ne nous reste plus que la partie CA/CRM, le reste ayant été migrer sur des systèmes plus performant et récents (et sûrs).
Nous devons donc continuer à travailler avec ça pendant quelques temps encore.
Ce qui m'intéresse sont en particulier 2 tables qui permettent de suivre le CA ;grosso modo des entreprises versent de l'argent 1 fois par an et je voudrais sortir un bilan sur x annees.
Le schéma des tables est simple pour le coup dans ces tables les données "devraient" être clean, je dis bien devraient.
Table ta_versements : id, id_etse, annee, montant_verse
Table ta_entreprises : id, nom, rattach_idmaitre (pour les filiales)
Je parviens à avoir le CA sur une année sans problèmes :
Mais si je souhaites avoir sur 3 ans je n'ai plus les mêmes chiffres, je pense que cela vient de mes jointures et du GROUP BY mais je ne parviens pas à trouver la soultion.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 SELECT te.nom AS nom_etse, ifnull(tem.nom,te.nom) AS nom_maitre, ta.montant_verse AS montant_n FROM ta_versements AS ta LEFT JOIN ta_entreprises AS te ON te.id = ta.id_etse LEFT JOIN ta_entreprises AS tem ON tem.id = te.rattach_idmaitre WHERE ta.annee = 2015
Voici ce qui ce rapproche le plus de la vérité :
Merci de votre aide.
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 SELECT ta.id_etse, te.nom AS nom_etse, IFNULL(tem.nom, te.nom) AS nom_maitre, n.montant_verse AS montant_n, n1.montant_verse AS montant_n1, n2.montant_verse AS montant_n2 FROM ta_versements AS ta LEFT JOIN ta_entreprises AS te ON te.id = ta.id_etse LEFT JOIN ta_entreprises AS tem ON tem.id = te.rattach_idmaitre LEFT JOIN ta_versements AS n ON n.id_etse = ta.id_etse AND n.annee = 2015 LEFT JOIN ta_versements AS n1 ON n1.id_etse = ta.id_etse AND n1.annee = 2014 LEFT JOIN ta_versements AS n2 ON n.id_etse = ta.id_etse AND n2.annee = 2013 WHERE ta.annee > 2012 GROUP BY ta.id_etse ORDER BY nom_maitre , nom_etse
David
Partager