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

Résolu/Fermé
Messages postés
13
Date d'inscription
dimanche 20 novembre 2016
Statut
Membre
Dernière intervention
4 décembre 2016
-
Messages postés
13
Date d'inscription
dimanche 20 novembre 2016
Statut
Membre
Dernière intervention
4 décembre 2016
-
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

Messages postés
18321
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
27 janvier 2022
1 003
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;
Messages postés
18321
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
27 janvier 2022
1 003
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?
Messages postés
18321
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
27 janvier 2022
1 003
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);
Messages postés
13
Date d'inscription
dimanche 20 novembre 2016
Statut
Membre
Dernière intervention
4 décembre 2016

Merci pour votre aide, cependant les résultats sont incorrects.
Je vous envoie les images de ce j'ai réussi à produire.
Messages postés
13
Date d'inscription
dimanche 20 novembre 2016
Statut
Membre
Dernière intervention
4 décembre 2016




Merci de votre aide !
Ci joint les résultats et les requêtes que j'ai exécuté.
Les résultats sont incorrects.
Messages postés
13
Date d'inscription
dimanche 20 novembre 2016
Statut
Membre
Dernière intervention
4 décembre 2016

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)
Messages postés
13
Date d'inscription
dimanche 20 novembre 2016
Statut
Membre
Dernière intervention
4 décembre 2016



Voici les captures
Messages postés
18321
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
27 janvier 2022
1 003
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.
Messages postés
13
Date d'inscription
dimanche 20 novembre 2016
Statut
Membre
Dernière intervention
4 décembre 2016

Je ne parviens toujours pas aux résultats escomptées... :(
Messages postés
13
Date d'inscription
dimanche 20 novembre 2016
Statut
Membre
Dernière intervention
4 décembre 2016



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.
Messages postés
13
Date d'inscription
dimanche 20 novembre 2016
Statut
Membre
Dernière intervention
4 décembre 2016

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 ?
Messages postés
18321
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
27 janvier 2022
1 003
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.
Messages postés
13
Date d'inscription
dimanche 20 novembre 2016
Statut
Membre
Dernière intervention
4 décembre 2016

Merci beaucoup, la logique est très claire !
Merci pour ce détail.
Bonne soirée
Messages postés
18321
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
27 janvier 2022
1 003
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!
Messages postés
13
Date d'inscription
dimanche 20 novembre 2016
Statut
Membre
Dernière intervention
4 décembre 2016
>
Messages postés
18321
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
27 janvier 2022

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 ?
Messages postés
18321
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
27 janvier 2022
1 003
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.
Messages postés
13
Date d'inscription
dimanche 20 novembre 2016
Statut
Membre
Dernière intervention
4 décembre 2016
>
Messages postés
18321
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
27 janvier 2022

Ce qui explique les montants qui ne correspondaient ni au total de l'une ou de l'autre.
Merci beaucoup pour cette explication !