Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1048 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Plusieurs COUNT même table

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Plusieurs COUNT même table

n°2232550
kyoku59
Posté le 03-07-2014 à 12:01:09  profilanswer
 

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

mood
Publicité
Posté le 03-07-2014 à 12:01:09  profilanswer
 

n°2232553
gpl73
Posté le 03-07-2014 à 12:56:23  profilanswer
 

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
n°2232577
ddr555
Posté le 03-07-2014 à 16:12:55  profilanswer
 

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

n°2232580
rufo
Pas me confondre avec Lycos!
Posté le 03-07-2014 à 16:23:40  profilanswer
 

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
n°2232601
kyoku59
Posté le 03-07-2014 à 17:30:34  profilanswer
 

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)

n°2232602
gpl73
Posté le 03-07-2014 à 17:30:47  profilanswer
 

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
n°2232641
kyoku59
Posté le 04-07-2014 à 06:54:26  profilanswer
 

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:

n°2232649
ddr555
Posté le 04-07-2014 à 09:29:57  profilanswer
 

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

n°2232948
kyoku59
Posté le 08-07-2014 à 12:28:27  profilanswer
 

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:

n°2232961
ddr555
Posté le 08-07-2014 à 15:08:21  profilanswer
 

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

mood
Publicité
Posté le 08-07-2014 à 15:08:21  profilanswer
 

n°2233101
kyoku59
Posté le 10-07-2014 à 07:37:08  profilanswer
 

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:

n°2233159
kyoku59
Posté le 11-07-2014 à 08:14:48  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Plusieurs COUNT même table

 

Sujets relatifs
Résumer plusieurs lignes en une seuleOuvrir plusieurs fichiers en vba
Eviter les doublons dans une tableMoyen le plus rapide de copier une grosse table SQL en mémoire ?
Executer un script si nouvelle ligne dans une table MySQLproblème pour inserer des données dans une table à partir d'un Jframe
placer image sur panel depuis menu, plusieurs images, non !!!plusieurs count() sur une même table!
Plusieurs Count et Group By sur une table[MySQL] Problème avec Jointure ( et plusieurs COUNT sur même table)
Plus de sujets relatifs à : Plusieurs COUNT même table


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR