Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 08/08/2011, 13h05   #1
Membre à l'essai
 
Inscription : janvier 2006
Messages : 120
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 120
Points : 24
Points : 24
Par défaut resultat count different

Bonjour à tous,

J'ai une problématique que je n'arrive pas à m'expliquer sous MySQL. J'ai une table qui se nomme export qui contient 4 champs : idpat, annee, age et lesiocimo.

La colonne idpat contient des doublons. Je dois calculer pour chaque lesiocimo son nombre pour chaque année. Puis son total sans distinction.

Dans un premier temps, j'extrais le nombre idpat pour chaque lesiocimo et par année en faisant :

Code :
1
2
3
4
5
 
SELECT count( DISTINCT idpat), annee AS Year 
FROM export 
WHERE idpat NOT LIKE '@%' AND lesiocimo = '9440/3' AND age>=18 
GROUP BY annee
Je fais la même chose pour les 3 autres codes lesiocimo.

En sortie pour l'année 1995 j'obtiens :

en sommant pour 1995:

lesiocimo :
9440/3 : 13
9400/3 : 0
9450/3 : 1
9451/3 : 8
9382/3 : 6

soit : 13 + 0 + 1 + 8 + 6 = 28

Maintenant, si je fais :
Code :
1
2
3
4
5
6
 
SELECT count(DISTINCT idpat) AS Total, annee AS Year 
FROM export 
WHERE (((idpat) NOT LIKE '@*') AND ((lesiocimo) LIKE '9400/3' OR (lesiocimo) LIKE '9440/3' OR (lesiocimo) LIKE '9450/3' OR (lesiocimo) LIKE '9451/3' OR (lesiocimo) LIKE '9382/3') AND ((age)>=18)) 
GROUP BY annee 
ORDER BY annee DESC
J'ai en sortie pour l'année 1995 un total de 26 ce qui est totalement différent du 28 trouvé. Comment ça se fait? Ai-je une erreur de logique dans une de mes requêtes ?

Merci.
Jarod51 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/08/2011, 13h18   #2
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 008
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 008
Points : 18 280
Points : 18 280
Envoyer un message via MSN à CinePhil
Citation:
Je dois calculer pour chaque lesiocimo son nombre pour chaque année.
Code :
1
2
3
4
5
SELECT lesiocimo, annee AS year, COUNT(DISTINCT idpat) AS nb_idpat
FROM export
WHERE idpat NOT LIKE '@%'
    AND age >= 18
GROUP BY lesiocimo, annee
Citation:
Puis son total sans distinction
Code :
1
2
3
4
5
SELECT lesiocimo, COUNT(DISTINCT idpat) AS nb_idpat
FROM export
WHERE idpat NOT LIKE '@%'
    AND age >= 18
GROUP BY lesiocimo
C'est ça que tu veux ?
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/08/2011, 13h20   #3
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 437
Points : 6 437
Bonjour,

Commence par remplacer les OR par un seul IN (plus efficace, plus lisible) et enlever toutes les parenthèses :
Code :
1
2
3
4
5
6
7
SELECT count(DISTINCT idpat) AS Total, annee AS Year 
FROM export 
WHERE idpat NOT LIKE '@*'
AND lesiocimo IN ('9400/3', '9440/3', '9450/3', '9451/3', '9382/3')
AND age >= 18
GROUP BY annee 
ORDER BY annee DESC
Qu'est-ce que tu obtiens ?
__________________
Rédacteur / Modérateur SGBD
Mes tutoriels et la FAQ MySQL

----------------------------------------------------
Pensez aux balises code et au tag
Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
ced est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/08/2011, 13h34   #4
Membre à l'essai
 
Inscription : janvier 2006
Messages : 120
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 120
Points : 24
Points : 24
Salut merci pour vos réponses. En fait, ce que je ne comprends c'est pourquoi je n'ai pas le même nombre j'ai un écart de +/-1 dans le total de la dernière requête même en utilisant la requête de ced.

par exemple :

Code :
1
2
3
4
5
 
SELECT count( DISTINCT idpat), annee AS Year 
FROM export 
WHERE idpat NOT LIKE '@%' AND lesiocimo = '9440/3' AND age>=18 
GROUP BY annee
je regarde l'année 1995 : j'ai 13

Code :
1
2
3
4
SELECT count( DISTINCT idpatient), annee AS Year 
FROM export 
WHERE idpatient NOT LIKE '@%' AND lesiocimo = '9441/3' AND age>=18 
GROUP BY annee
1995 : lesiocimo = '9450/3' j'ai 1
1995 : lesiocimo = '9451/3' j'ai 8
1995 : lesiocimo = '9382/3' j'ai 6

si je somme : 13+1+8+6 = 28 ce qui est différent du résultat 26 qui resort directement de la requête :
Code :
1
2
3
4
5
6
7
8
 
SELECT count(DISTINCT idpat) AS Total, annee AS Year 
FROM export 
WHERE idpat NOT LIKE '@*'
AND lesiocimo IN ('9400/3', '9440/3', '9450/3', '9451/3', '9382/3')
AND age >= 18
GROUP BY annee 
ORDER BY annee DESC
Pourquoi ? C'est ça que je n'arrive pas à comprendre cette difference, c'est pourtant une somme toute simple, pourquoi cet écart
Jarod51 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/08/2011, 15h20   #5
Membre habitué
 
Inscription : septembre 2002
Messages : 140
Détails du profil
Informations forums :
Inscription : septembre 2002
Messages : 140
Points : 118
Points : 118
Bonjour,
Est-ce que ta différence ne proviendrait pas du fait que 2 patients sont revenus 2 années différentes : dans tes requêtes individuelles tu les comptes chaque année, mais lorsque tu regardes s'ils sont venus dans les 5 dernières années, ils ne comptent qu'une seule fois. C'est ça ?
papa6 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/08/2011, 15h49   #6
Membre à l'essai
 
Inscription : janvier 2006
Messages : 120
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 120
Points : 24
Points : 24
salut papa6,

En fait, si il revient 2 années différentes, il garde le même idpat. C'est pour cela que je fais un distinct idpat pour ne pas les comptabiliser plusieurs fois.
Jarod51 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/08/2011, 10h16   #7
Membre habitué
 
Inscription : septembre 2002
Messages : 140
Détails du profil
Informations forums :
Inscription : septembre 2002
Messages : 140
Points : 118
Points : 118
Bonjour,
Au fait, il ne faut pas grouper le total par année !
Code :
1
2
3
4
5
SELECT count(DISTINCT idpat) AS Total
FROM export 
WHERE idpat NOT LIKE '@*'
AND lesiocimo IN ('9400/3', '9440/3', '9450/3', '9451/3', '9382/3')
AND age >= 18
papa6 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/08/2011, 11h58   #8
Membre à l'essai
 
Inscription : janvier 2006
Messages : 120
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 120
Points : 24
Points : 24
Salut papa6,

Merci pour ta réponse. Pourquoi il ne faut pas regrouper par année ? Si je veux avoir le total de tous ces codes par année comment dois je faire ?

Merci encore pour l'aide.
Jarod51 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/08/2011, 20h25   #9
Membre habitué
 
Inscription : septembre 2002
Messages : 140
Détails du profil
Informations forums :
Inscription : septembre 2002
Messages : 140
Points : 118
Points : 118
Bonsoir Jarod,
Est-ce que la dernière requête que j'ai proposée retourne bien 26 (ou alors 28?)

Si tu regroupes par année, tu auras les clients venus des années différentes comptabilisés plusieurs fois.

Tu peux vérifier à la main pour chaque année en cherchant tes 2 doublons :
Code :
1
2
3
4
SELECT DISTINCT idpat, annee AS Year 
FROM export 
WHERE idpat NOT LIKE '@%' AND lesiocimo = '9440/3' AND age>=18 
GROUP BY  idpat, annee
et de même pour les 3 autres années
papa6 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/08/2011, 09h02   #10
Membre à l'essai
 
Inscription : janvier 2006
Messages : 120
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 120
Points : 24
Points : 24
Salut papa6,

Ta dernière requête :

Code :
1
2
3
4
5
6
 
SELECT count(DISTINCT idpat) AS Total
FROM export 
WHERE idpat NOT LIKE '@*'
AND lesiocimo IN ('9400/3', '9440/3', '9450/3', '9451/3', '9382/3')
AND age >= 18
me retourne 659.

Par contre, pour la dernière requête :

Code :
1
2
3
4
5
 
SELECT DISTINCT idpat, annee AS Year 
FROM export 
WHERE idpat NOT LIKE '@%' AND lesiocimo = '9440/3' AND age>=18 
GROUP BY  idpat, annee
c'est un peu chaud de se farcir toutes les pages à la recherche de doublon. Mais théoriquement, si la requête contient la clause DISTINCT j'élimine les doublons ??

A+
Jarod51 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/08/2011, 15h00   #11
Membre à l'essai
 
Inscription : janvier 2006
Messages : 120
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 120
Points : 24
Points : 24
Je suis finalement passé par une table temporaire pour faire un sum(count), je retombe sur mes pattes .

A+
Jarod51 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h55.


 
 
 
 
Partenaires

Hébergement Web