Plusieurs COUNT même table

Plusieurs COUNT même table - SQL/NoSQL - Programmation

Marsh Posté le 03-07-2014 à 12:01:09    

Bonjour,
 
Je suis confronté à un cas que je n'ai jamais vue et je n'arrive pas à m'en sortir (Surement tout simple)
 
Je dispose d'une table ENVOI qui possède 3 clés étrangère qui pointent sur une la même table PANNE
 
Dans ma table envoi je dispose donc 3 champs qui font référence a PANNE
 
PANNE(ID_PANNE, LIBELLE)
ENVOI(ID_ENVOI, #PANNE_ID1, #PANNE_ID2, #PANNE_ID3)
 
Je voudrai avoir un résultat avec 2 champs comme suit :
PANNE.LIBELLE | COUNT(PANNE_ID1) + COUNT(PANNE_ID2) + COUNT(PANNE_ID3)
 
Pour exemple :
Ecran HS | 12
Problème de connexion | 2
 
 
Je pourrai le faire en 3 fois mais ça serait beaucoup plus pratique si je pouvais le faire en une fois.
 
Merci à vous

Reply

Marsh Posté le 03-07-2014 à 12:01:09   

Reply

Marsh Posté le 03-07-2014 à 12:56:23    

Essaie de faire un truc comme ça :
tu comptes les ID panne dans ta table envoie pour chacune des 3 colonnes :
 
select x.libelle , count (A.panne_id1)+count(B.panne_id2) +count(C.panne_Id3) from
panne as x
inner join envoi as a
x.id_panne= a.panne_id1
inner join envoi as b
x.id_panne= b.panne_id2
inner join envoi as c
x.id_panne= c.panne_id3
groupe by x.libelle
 
Normalement cela devrait marcher...:)
Guillaume


---------------
mieux vaut être un con au chaud, qu'un con gelé lol
Reply

Marsh Posté le 03-07-2014 à 16:12:55    

j'ai un doute sur le fait que ça marche. pour peu qu'il y ait un id non représenté et ta requête ne renverra pas de ligne. en remplaçant par des jointures externes ça serait déjà mieux

Reply

Marsh Posté le 03-07-2014 à 16:23:40    

ben avec des left join alors ;)


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 03-07-2014 à 17:30:34    

Effectivement la requête ne fonctionne pas
Il m'affiche 2 lignes sur 9 avec des données incohérente.
 
Pour info il manquait des "ON" a la requête
 
select x.libelle , count (A.panne_id1)+count(B.panne_id2) +count(C.panne_Id3) from
panne as x
inner join envoi as a ON
x.id_panne= a.panne_id1
inner join envoi as b ON
x.id_panne= b.panne_id2
inner join envoi as c ON
x.id_panne= c.panne_id3
groupe by x.libelle  
 
Pour la solution en rajoutant LEFT je test et reviens vers vous (très certainement demain matin avant le levé du soleil XD)

Reply

Marsh Posté le 03-07-2014 à 17:30:47    

j'ai pas essayé... (je suis en vacances, pas de base sql ou as400 sous la main ... pour "valider" ma proposition...)
 
ddr555, comme dit ruffo, tu remplaces le inner par un left outer join et paf... ça marche :)
 
Guillaume


---------------
mieux vaut être un con au chaud, qu'un con gelé lol
Reply

Marsh Posté le 04-07-2014 à 06:54:26    

Non ce n'est pas la bonne recette :cry:  
J'ai des données incohérente du genre au lieu d'avoir 12 j'ai 196 et en même temps pour certains les données sont bonne.  
 
J'ai fait comme ceci :
select x.libelle , count(A.panne_id1) + count(B.panne_id2) + count(C.panne_Id3) as nbr from
panne as x
left outer join envoi as a ON
x.id_panne= a.panne_id1
left outer join envoi as b ON
x.id_panne= b.panne_id2
left outer join envoi as c ON
x.id_panne= c.panne_id3
group by x.libelle  
 
Au faite, Bonne vacances gpl73 :sol:

Reply

Marsh Posté le 04-07-2014 à 09:29:57    

logique, si tu as 2, 3 et 4 lignes, ça multiplie le nombre de lignes et au résultat tu as dans ce cas 24 en résultat.
mieux vaut utiliser un union entre 3 requêtes pour chaque colonne, mais je ne sais pas dans ton SGBD comment ça s'écrit

Reply

Marsh Posté le 08-07-2014 à 12:28:27    

En faisant ainsi j'ai plusieurs même résultat, ce qui se comprend car 3 tables
 
SELECT p.ID_PANNE, p.LIBELLE, count(E.PANNE_ID1) as nbr
FROM PANNE as P left outer join ENVOI as E ON
p.id_panne= e.panne_id1  
Where p.ID_PANNE <> 1
Group by p.ID_PANNE, p.LIBELLE
 
union
 
SELECT p.ID_PANNE, p.LIBELLE, count(E.PANNE_ID2) as nbr
FROM PANNE as P left outer join ENVOI as E ON
p.id_panne= e.panne_id2  
Where p.ID_PANNE <> 1
Group by p.ID_PANNE, p.LIBELLE
 
union
 
SELECT p.ID_PANNE, p.LIBELLE, count(E.PANNE_ID3) as nbr
FROM PANNE as P left outer join ENVOI as E ON
p.id_panne= e.panne_id3  
Where p.ID_PANNE <> 1
Group by p.ID_PANNE, p.LIBELLE
 
J'aurai du écouter en cours :whistle:

Reply

Marsh Posté le 08-07-2014 à 15:08:21    

t'étais pas loin, manquait un regroupement
 
select a.IP_PANNE,a.LIBELLE,sum(a.nbr) from
(
SELECT p.ID_PANNE, p.LIBELLE, count(E.PANNE_ID1) as nbr  
FROM PANNE as P left outer join ENVOI as E ON  
p.id_panne= e.panne_id1  
Where p.ID_PANNE <> 1  
Group by p.ID_PANNE, p.LIBELLE  
union  
SELECT p.ID_PANNE, p.LIBELLE, count(E.PANNE_ID2) as nbr  
FROM PANNE as P left outer join ENVOI as E ON  
p.id_panne= e.panne_id2  
Where p.ID_PANNE <> 1  
Group by p.ID_PANNE, p.LIBELLE  
union  
SELECT p.ID_PANNE, p.LIBELLE, count(E.PANNE_ID3) as nbr  
FROM PANNE as P left outer join ENVOI as E ON  
p.id_panne= e.panne_id3  
Where p.ID_PANNE <> 1  
Group by p.ID_PANNE, p.LIBELLE ) a
group by a.IP_PANNE,a.LIBELLE

Reply

Marsh Posté le 08-07-2014 à 15:08:21   

Reply

Marsh Posté le 10-07-2014 à 07:37:08    

Ha la classe !   :jap:  :bounce:  :jap:  
 
En faite j'avais tenté la même chose mais sans la fonction sum et effectivement maintenant ça devient logique  
 
Merci pour votre aide  :jap:

Reply

Marsh Posté le 11-07-2014 à 08:14:48    

Est-il possible d'utiliser la fonction Year() sans altérer au résultat ?
J'aimerai faire des stats sur ces résultats.
 
La logique veut qu'il est impossible de rajouter mon champs ENVOI.DATE_RETOUR car aucun n'est identique.
 
Je travail actuellement en VB.net et je vois comment procéder mais il risque d'y avoir beaucoup de boucle. La solution la plus simple serai d'avoir une requête ou je pourrai mettre ma date ou mon mois en paramètre.  
Si toute fois, je ré-ouvrirai un Post avec cette problématique.
 
Merci à vous

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed