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

Résolu/Fermé
SLM-BHY Messages postés 28 Date d'inscription vendredi 21 décembre 2012 Statut Membre Dernière intervention 7 mai 2015 - 30 avril 2015 à 20:02
SLM-BHY Messages postés 28 Date d'inscription vendredi 21 décembre 2012 Statut Membre Dernière intervention 7 mai 2015 - 7 mai 2015 à 01:53
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
30 avril 2015 à 21:38
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 39583 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 18 avril 2024 9 225
Modifié par jee pee le 30/04/2015 à 22:49
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 vendredi 21 décembre 2012 Statut Membre Dernière intervention 7 mai 2015
4 mai 2015 à 14:56
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 39583 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 18 avril 2024 9 225
Modifié par jee pee le 4/05/2015 à 19:01
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 vendredi 21 décembre 2012 Statut Membre Dernière intervention 7 mai 2015
5 mai 2015 à 21:00
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 vendredi 21 décembre 2012 Statut Membre Dernière intervention 7 mai 2015
5 mai 2015 à 21:16
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 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 4 649 > SLM-BHY Messages postés 28 Date d'inscription vendredi 21 décembre 2012 Statut Membre Dernière intervention 7 mai 2015
5 mai 2015 à 21:49
Bonjour
les parenthèses ne sont pas bien placées.
0
SLM-BHY Messages postés 28 Date d'inscription vendredi 21 décembre 2012 Statut Membre Dernière intervention 7 mai 2015
5 mai 2015 à 22:13
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 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 4 649
5 mai 2015 à 22:34
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 vendredi 21 décembre 2012 Statut Membre Dernière intervention 7 mai 2015
5 mai 2015 à 23:55
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 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 4 649 > SLM-BHY Messages postés 28 Date d'inscription vendredi 21 décembre 2012 Statut Membre Dernière intervention 7 mai 2015
6 mai 2015 à 00:01
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 vendredi 21 décembre 2012 Statut Membre Dernière intervention 7 mai 2015
7 mai 2015 à 01:53
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