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

Résolu
Kiroul Messages postés 13 Date d'inscription   Statut Membre Dernière intervention   -  
Kiroul Messages postés 13 Date d'inscription   Statut Membre Dernière intervention   -
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.

A voir également:

10 réponses

yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 584
 
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 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 584
 
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 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 584
 
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   Statut Membre Dernière intervention  
 
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   Statut Membre Dernière intervention  
 



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   Statut Membre Dernière intervention  
 
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   Statut Membre Dernière intervention  
 


Voici les captures
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 584
 
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   Statut Membre Dernière intervention  
 
Je ne parviens toujours pas aux résultats escomptées... :(
0
Kiroul Messages postés 13 Date d'inscription   Statut Membre Dernière intervention  
 


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   Statut Membre Dernière intervention  
 
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 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 584
 
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   Statut Membre Dernière intervention  
 
Merci beaucoup, la logique est très claire !
Merci pour ce détail.
Bonne soirée
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 
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   Statut Membre Dernière intervention   > yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention  
 
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 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 
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   Statut Membre Dernière intervention   > yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention  
 
Ce qui explique les montants qui ne correspondaient ni au total de l'une ou de l'autre.
Merci beaucoup pour cette explication !
0