Requête addition de champs sur tables différentes + tri

Résolu/Fermé
Kiroul Messages postés 13 Date d'inscription dimanche 20 novembre 2016 Statut Membre Dernière intervention 4 décembre 2016 - 20 nov. 2016 à 16:39
Kiroul Messages postés 13 Date d'inscription dimanche 20 novembre 2016 Statut Membre Dernière intervention 4 décembre 2016 - 4 déc. 2016 à 10:22
Bonjour,

Je dispose d'une base conséquente (plusieurs millions d'enregistrements) et je souhaite :
- faire la somme de 2 champs (Chiffre d'affaires) se trouvant dans 2 tables différentes
- Trier les chiffre d'affaires totaux (des 2 tables) selon l'année

Je souhaite donc obtenir un résultat comme suite :

Année - CA de l'année
2012 - 3 000 000
2013 - 3 200 000
2014 - 3 250 000

Le CA regroupant à la fois la somme du CA de la table 1 et de la table 2
Je dispose de champs date sur chacune des tables.

10 réponses

yg_be Messages postés 22724 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 avril 2024 1 476
21 nov. 2016 à 13:25
Et ceci (pas testé) ?
SELECT Année, sum(SousTotaux) AS SommeDeSalesAmount
FROM 
(SELECT year(DateKey) as Année, sum(SalesAmount) AS SousTotaux from FactOnlineSales
group by year(DateKey)
union all
SELECT year(DateKey), sum(SalesAmount) from FactSales
group by year(DateKey)) 
GROUP BY Année;
1
yg_be Messages postés 22724 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 avril 2024 1 476
20 nov. 2016 à 22:32
Pour faire la somme de 2 champs (Chiffre d'affaires) se trouvant dans 2 tables différentes, je propose (ca1 et ca2 sont les noms des deux tables, et ca est le nom du champs contenant le chiffre d'affaire :
select s1.sca+s2.sca
from
(select sum(ca) as sca from ca1) as s1
, (select sum(ca) as sca from ca2) as s2

Qu'en penses-tu?
0
yg_be Messages postés 22724 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 avril 2024 1 476
Modifié par yg_be le 20/11/2016 à 23:10
Pour calculer les chiffre d'affaires totaux (des 2 tables) selon l'année, je propose :
SELECT year(ca1.DT), sum(ca1.ca) AS sca
FROM (SELECT ca1.dt, ca1.ca,1 from ca1
union 
SELECT ca2.dt, ca2.ca,2 from ca2) 
GROUP BY year(ca1.dt);
0
Kiroul Messages postés 13 Date d'inscription dimanche 20 novembre 2016 Statut Membre Dernière intervention 4 décembre 2016
21 nov. 2016 à 09:51
Merci pour votre aide, cependant les résultats sont incorrects.
Je vous envoie les images de ce j'ai réussi à produire.
0
Kiroul Messages postés 13 Date d'inscription dimanche 20 novembre 2016 Statut Membre Dernière intervention 4 décembre 2016
21 nov. 2016 à 09:49



Merci de votre aide !
Ci joint les résultats et les requêtes que j'ai exécuté.
Les résultats sont incorrects.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Kiroul Messages postés 13 Date d'inscription dimanche 20 novembre 2016 Statut Membre Dernière intervention 4 décembre 2016
21 nov. 2016 à 09:57
Voici les résultats que j'obtiens (CA1 suivi de CA2), je souhaite faire la somme des 2 totaux de chaque année (2007 : 719M+4 561M)
0
Kiroul Messages postés 13 Date d'inscription dimanche 20 novembre 2016 Statut Membre Dernière intervention 4 décembre 2016
21 nov. 2016 à 09:59


Voici les captures
0
yg_be Messages postés 22724 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 avril 2024 1 476
Modifié par yg_be le 21/11/2016 à 11:54
Je pense que la requête devrait être :
SELECT year(DateKey) as Année, sum(SalesAmount) AS SommeDeSalesAmount
FROM 
(SELECT DateKey, SalesAmount,1 from FactOnlineSales
union 
SELECT DateKey, SalesAmount,2 from FactSales) 
GROUP BY year(DateKey);

Si possible, merci de copier les requêtes comme texte, pas comme image, c'est plus facile à récupérer.
0
Kiroul Messages postés 13 Date d'inscription dimanche 20 novembre 2016 Statut Membre Dernière intervention 4 décembre 2016
21 nov. 2016 à 13:18
Je ne parviens toujours pas aux résultats escomptées... :(
0
Kiroul Messages postés 13 Date d'inscription dimanche 20 novembre 2016 Statut Membre Dernière intervention 4 décembre 2016
21 nov. 2016 à 13:06


Essai 1 :

SELECT year(DateKey) as Année, sum(SalesAmount) AS SommeDeSalesAmount
FROM
(SELECT DateKey, SalesAmount,1 from FactOnlineSales
union
SELECT DateKey, SalesAmount,2 from FactSales)
GROUP BY year(DateKey);

Essai 2 :

SELECT year(DateKey) as Année, sum(SalesAmount) AS SommeDeSalesAmount
FROM
(SELECT DateKey, SalesAmount from FactOnlineSales
union
SELECT DateKey, SalesAmount from FactSales)
GROUP BY year(DateKey);

Même si la logique me semble bonne, je pense que le résultat est erroné
Je ne parviens pas à comprendre les résultats de Sommes de Sales Amount.
0
Kiroul Messages postés 13 Date d'inscription dimanche 20 novembre 2016 Statut Membre Dernière intervention 4 décembre 2016
21 nov. 2016 à 14:34
Cela semble fonctionner ! :)
Merci beaucoup !
Pourriez-vous m'expliquer le fonctionnement de la requête ?
Comment les SELECT de la ligne 7 s'ajoutent à sum(SousTotaux) ?
Comment l'année de la table FactSales et celle de FactOnlineSales se lient ?
0
yg_be Messages postés 22724 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 avril 2024 1 476
Modifié par yg_be le 21/11/2016 à 15:19
SELECT Année, sum(SousTotaux) AS SommeDeSalesAmount
FROM 
(
SELECT year(DateKey) as Année, sum(SalesAmount) AS SousTotaux from FactOnlineSales
group by year(DateKey)
union all
SELECT year(DateKey) as Année, sum(SalesAmount) AS SousTotaux from FactSales
group by year(DateKey)
) 
GROUP BY Année;

Je pense que tu vas comprendre si tu fais ceci (j'ai ajouté les "AS" (inutiles) dans le select de la ligne 8, et j'ai mis les parenthèses en évidence en lignes 3 et 10, pour que ce soit plus clair) :
- exécute la requete dans les lignes 4 à 6
- puis 8 à 9
- ensuite les lignes 4 à 9
- puis le tout
N'hésite pas à poser d'autres questions, j'essayerai d'y répondre.
0
Kiroul Messages postés 13 Date d'inscription dimanche 20 novembre 2016 Statut Membre Dernière intervention 4 décembre 2016
21 nov. 2016 à 18:49
Merci beaucoup, la logique est très claire !
Merci pour ce détail.
Bonne soirée
0
yg_be Messages postés 22724 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 avril 2024 1 476
21 nov. 2016 à 19:05
Remercions ceux qui ont conçu SQL !
Par contre, je ne comprends pas pourquoi ceci (plus concis mais sans doute moins efficace) ne donne pas les totaux corrects :
SELECT year(DateKey) as Année, sum(SalesAmount) AS SommeDeSalesAmount
FROM 
(
SELECT DateKey, SalesAmount from FactOnlineSales
union all
SELECT DateKey, SalesAmount from FactSales
) 
GROUP BY year(DateKey);
bonne soirée!
0
Kiroul Messages postés 13 Date d'inscription dimanche 20 novembre 2016 Statut Membre Dernière intervention 4 décembre 2016 > yg_be Messages postés 22724 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 avril 2024
22 nov. 2016 à 18:20
Je viens de tester votre dernière requête et celle-ci me donne les mêmes résultats.

Si les champs des 2 tables avait eu des noms différents (CA et SalesAmount/dateKey et date du jour par exemple) comment aurait-il été possible de lier les deux en ligne 1 ?
0
yg_be Messages postés 22724 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 avril 2024 1 476
22 nov. 2016 à 19:39
Je pense avoir compris pourquoi mes premières suggestions foiraient : c'est parce que le "union" (sans "all") élimine les doublons dans la réponse, et donc que, si tu avais plusieurs enregistrements identiques (même dates et mêmes montants), il n'en gardait qu'un. :-(
Pour répondre à ta question : le "union all" ne tient pas compte des noms retournés par le second select (ligne 6), il tient compte des noms retournés par le premier select (ligne 4), le second select doit avoir le même nombre de champs, et dans le bon ordre.
C'est bien le "union all" qui fait ce boulot de "lien", pas le select de la ligne 1.
0
Kiroul Messages postés 13 Date d'inscription dimanche 20 novembre 2016 Statut Membre Dernière intervention 4 décembre 2016 > yg_be Messages postés 22724 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 avril 2024
23 nov. 2016 à 11:26
Ce qui explique les montants qui ne correspondaient ni au total de l'une ou de l'autre.
Merci beaucoup pour cette explication !
0