SQL - Faire des totaux avec 2 bases de données

Résolu
SLM-BHY Messages postés 28 Date d'inscription   Statut Membre Dernière intervention   -  
SLM-BHY Messages postés 28 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

Je viens solliciter votre aide car je suis bloqué sur une requête SQL.

Voila, j'aimerai pouvoir faire un tableau en affichant ligne par ligne des totaux différents. Par exemple, imaginons un loueur de voiture qui aimerait avoir une vision de son parc voiture à travers un tableau global (Nb voiture en location, Nombre voiture en maintenance, Nombre voiture roue crevé...).

Pour cela, dans mon Select j'utilise des SUM conditionnel qui me permettent de faire mes différents totaux suivant les critères qui m'intéresse.
Exemple :
Select
sum(case when Statut = "En location" and Type = "Voiture" then 1 else 0 end) as NbVoitureEnLoc
....

From tbl_Voiture

Voila, tout se passe très bien, jusqu'au moment ou je souhaite faire une somme en allant chercher des valeurs d'une seconde table ("tbl_détailvoiture").

Dès que je rajoute cette table dans mon from (c'est à dire 'From tbl_voiture, tbl_detailvoiture') tous mes totaux précédents m'affichent de mauvais résultats... je sais pas ce qu'il se passe...

Je sais pas si j'ai été bien clair, mais je peux apporter plus de précisions si nécessaire.

Je vous remercie par avance de votre aide.
A voir également:

5 réponses

Utilisateur anonyme
 
Bonjour

Ce qui ce passe, c'est que 'From tbl_voiture, tbl_detailvoiture' ne signifie pas "d'abord avec la table tbl_voiture, puis avec la table tbl_detailvoiture" mais "avec toutes les combinaisons possibles de toutes les lignes de tbl_voiture avec chaque ligne de tbl_detailvoiture".
Si une des tables a 20 lignes et l'autre 30, ça ne va pas faire 50 lignes en tout, mais 600.
Ceci étant dit, ça doit être possible avec une requête UNION, je sais que ça existe mais je ne maîtrise pas assez pour te donner une réponse plus précise.
0
jee pee Messages postés 41520 Date d'inscription   Statut Modérateur Dernière intervention   9 720
 
Bonjour,

Si je reprends ton titre c'est plutôt "avec 2 tables" donc.

Le sql n'est pas idéal pour additionner les choux et les carottes. Pour cela des outils (requéteurs) plus sophistiqués sont utilisés.

En sql on peut utiliser, comme le signale le père, des artifices comme l'union. Mais il faut que les colonnes des 2 select correspondent.

Exemple

select 'table A' Dans, count(*) nb_enr from tableA
union
select 'table B' Dans, count(*) nb_enr from tableB


Dans le cas présent nous n'avons pas assez d'éléments pour te guider. Que vois tu comme état de sortie, que contiennent les tables et leurs liens ?



        Un étranger, c'est un ami qu'on n'a pas encore rencontré.
0
SLM-BHY Messages postés 28 Date d'inscription   Statut Membre Dernière intervention  
 
Bonjour,

je vous remercie pour vos réponses.

J'ai une première table qui contient énormément d'information sur l'ouverture d'un bon de travail d'une voiture.
Par exemple on a le code du bon de travail (CODE_WORKORDER), Statut du bon de travail (STATUS), le code voiture (ex voiture 43) (CODE_EQUIPMENT), le type d'anomalie (CODE_ANOMALIE), vandalisme (oui/non) (WOB1), les dates de création et clôture du bon de travail (CREATIONDATE, MODIFICATIONDATE...), le site (Paris, Rennes...) (CODE_SITE), ....

Dans ma seconde table, qui d'ailleurs est très petite, j'ai uniquement des informations concernant la cause d'anomalie, (colonne "CAUSE") et la solution apportée (colonne "REMEDY").

La clé étrangère (il me semble que c'est le nom) qui relie les deux tables sont le Code du bon de travail (CODE_WORKORDER) et le site (CODE_SITE).

Ce que j'aimerai faire c'est avoir sur le même tableau :
- le nombre de BT créé sur une période
- le nombre de BT terminé sur une période
- Le nombre de BT ayant comme CAUSE "Pneu crevé" sur une période
- Le nombre de BT ayant comme CAUSE "xxxx" .... sur une période

Donc voila, individuellement je n'ai aucun soucis à retrouver les valeurs de chaque indicateur (total). Mais dès que j'essaie d'effectuer mes calculs dans le même rapport je n'y arrive plus (croisement des deux tables).

Pour répondre à ce que vous me conseillé, je dois donc utiliser l'union mais comment puis-je m'y prendre ? Dois-je dans un premier temps faire toutes mes "SUM" de la même table puis faire un UNION et faire toutes mes "SUM" issues de la seconde table ?

Voici un exemple de ce que je fais :

sum(case when CODE_EQUIPMENT = "VOITURE" and Status != "40-Annulé" and (bt.creationdate between $P{DATEDEBUT} and $P{DATEFIN}) then 1 else 0 end) as btvoiturecrees,

sum(case when CODE_EQUIPMENT = "VOITURE" and WOB1 = 1 and (bt.CREATIONDATE between $P{DATEDEBUT} and $P{DATEFIN}) then 1 else 0 end) as btvoiturevandal,

sum(case when CODE_EQUIPMENT = "VOITURE" and Status = "30-Terminé" and Remedy = "CHANGEMENT PNEU" and (bt.STATUSDATE between $P{DATEDEBUT} and $P{DATEFIN}) then 1 else 0 end) as btvoiturepneu,


Donc ces trois calcul je les mets directement dans mon select. Les deux premiers sont issus de la première table est fonctionnent correctement. Dès que je rajoute le troisième calcul (qui doit piocher des infos de la seconde table) tous mes calcul sont faussés.
0
jee pee Messages postés 41520 Date d'inscription   Statut Modérateur Dernière intervention   9 720
 
Si le résultat du select sur chacune des 2 tables n'est qu'une seule ligne, le produit cartésien donnant toujours 1, tu pourrais faire un

select * from 
(select sum ... from tbl_voiture), 
(select sum ... from tbl_detailvoiture)




        Un étranger, c'est un ami qu'on n'a pas encore rencontré.
0
SLM-BHY Messages postés 28 Date d'inscription   Statut Membre Dernière intervention  
 
Bonjour Jee pee,

Merci de ta réponse, je teste ça tout de suite.
Je te tiens au courant.
0
SLM-BHY Messages postés 28 Date d'inscription   Statut Membre Dernière intervention  
 
Je viens de faire les tests est malheureusement ça ne fonctionne pas...
Ci-dessous ce que j'ai fait :
SELECT *
FROM 
(select (sum tbl_voiture.CODE_WORKORDER) from tbl_voiture) 
0
jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752 > SLM-BHY Messages postés 28 Date d'inscription   Statut Membre Dernière intervention  
 
Bonjour
les parenthèses ne sont pas bien placées.
0
SLM-BHY Messages postés 28 Date d'inscription   Statut Membre Dernière intervention  
 
Désolé, je n'y arrive pas...
0

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

Posez votre question
jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 
SELECT *
FROM 
(SELECT SUM (tonchamp) as somme
FROM tatable
)T1
,
(SELECT SUM (autrechamp) AS TOTO
FROM tabletruc
)T2

0
SLM-BHY Messages postés 28 Date d'inscription   Statut Membre Dernière intervention  
 
Je te remercie énormément Jordane45, j'ai enfin réussi à faire ce que je souhaitais !! J'ai fait 2 - 3 tests, ça à l'air correct. Demain je terminerai ma requête et je t'en dirait des nouvelles !
Tu as réussi à me sortir d'une galère !!! Encore merci :).
0
jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752 > SLM-BHY Messages postés 28 Date d'inscription   Statut Membre Dernière intervention  
 
De rien. .. mais c'est jee pee qui t'a proposé la solluce :-)
Pense à clôturer la discussion si ton souci est résolu.
0
SLM-BHY Messages postés 28 Date d'inscription   Statut Membre Dernière intervention  
 
Effectivement, merci Jee pee !! :).
Je viens de finir l'ensemble de la requête, demain je fais mes vérifications et si tout me semble correcte je clôture la discussion directement. Cela m'éviterai de recréer une discussion si jamais je vois une coquille...
0