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 -
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.
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:
- SQL - Faire des totaux avec 2 bases de données
- Supercopier 2 - Télécharger - Gestion de fichiers
- Trier des données excel - Guide
- Supprimer les données de navigation - Guide
- Faire 2 colonnes sur word - Guide
- Sauvegarde des données - Guide
5 réponses
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.
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.
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
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é.
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é.
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 :
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.
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.
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
Un étranger, c'est un ami qu'on n'a pas encore rencontré.
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é.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionSELECT * FROM (SELECT SUM (tonchamp) as somme FROM tatable )T1 , (SELECT SUM (autrechamp) AS TOTO FROM tabletruc )T2