Plusieurs COUNT même table - SQL/NoSQL - Programmation
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
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
Marsh Posté le 03-07-2014 à 16:23:40
ben avec des left join alors
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)
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
Marsh Posté le 04-07-2014 à 06:54:26
Non ce n'est pas la bonne recette
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
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
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
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
Marsh Posté le 10-07-2014 à 07:37:08
Ha la classe !
En faite j'avais tenté la même chose mais sans la fonction sum et effectivement maintenant ça devient logique
Merci pour votre aide
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
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