Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
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 28/09/2011, 15h30   #1
Invité de passage
 
Homme
Ingénieur Télécom
Inscription : septembre 2011
Messages : 5
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Ingénieur Télécom
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : septembre 2011
Messages : 5
Points : 0
Points : 0
Par défaut Trouver des valeurs non uniques dans une table

Bonjour,
Débutant en SQL je tourne en rond depuis deux jours pour trouver la solution au problème suivant:
Je gère une bdd de suivi de retours SAV.
La table principale est donc remplie avec les retours des produits en SAV.

Les champs de la table principale sont, entres autres:
NumSerie et DateArrivée.
Extrait:
"A12083401578615307";"2011-05-16"
"A12083401790515300";"2011-05-17"
"A12083402650215309";"2011-05-16"
"A12083401790515300";"2011-05-21"
"A12083403027815306";"2011-05-16"

Là où je coince c'est pour concevoir la requête qui me permettra de connaitre les produits qui sont revenus plusieurs fois en SAV.
Ce sont donc les n° de série qui ne sont pas unique.
ex:
"A12083401790515300";"2011-05-17"
"A12083401790515300";"2011-05-21"


Par avance, merci pour votre aide
morbli est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/09/2011, 15h36   #2
Membre Expert
 
Homme Sylvain Devidal
Chef de projets Générix
Inscription : février 2010
Messages : 1 062
Détails du profil
Informations personnelles :
Nom : Homme Sylvain Devidal
Âge : 33
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Chef de projets Générix
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2010
Messages : 1 062
Points : 1 515
Points : 1 515
Il faut filtrer avec having count(*) > 1

Tu devras faire une sous-requête pour récupérer ensuite le max (ou min) de la date pour chaque numéro de série retourné par la sous-requête.
StringBuilder est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/09/2011, 16h33   #3
Invité de passage
 
Homme
Ingénieur Télécom
Inscription : septembre 2011
Messages : 5
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Ingénieur Télécom
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : septembre 2011
Messages : 5
Points : 0
Points : 0
Merci pour ta réponse.
J'ai appliqué ton conseil. Hélas, je n'obtiens pas exactement ce que je cherche.

Ci-dessous quelques données. En bleu, les données que je souhaite retrouver.
Numero Serie Date Arrivee
IE1000390502230168 2010-04-05
IE1000390732230167 2010-04-14
IE1000390807830162 2010-04-05
IE1000390502230168 2011-04-05
IE1000390732230167 2011-04-14
IE1000390807830162 2011-04-05
IE1000390973130165 2011-05-26
IE1000390994630163 2011-05-24
IE1000391056130164 2011-05-24
IE1000391061130166 2011-06-01
IE1000410073030162 2011-05-31

La requête créée
Code :
1
2
SELECT `Numero Serie`, `Date Arrivee` FROM `main`
GROUP BY `Numero Serie` HAVING COUNT(`Numero Serie`) > 1
et son résultat. Les n° de série concernés s'y trouvent mais seulement une fois.
Numero Serie Date Arrivee
IE1000390502230168 2010-04-05
IE1000390732230167 2010-04-14
IE1000390807830162 2010-04-05

alors que je souhaite avoir ceci
Numero Serie Date Arrivee
IE1000390502230168 2010-04-05
IE1000390732230167 2010-04-14
IE1000390807830162 2010-04-05
IE1000390502230168 2011-04-05
IE1000390732230167 2011-04-14
IE1000390807830162 2011-04-05
morbli est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/09/2011, 16h47   #4
Membre Expert
 
Homme Sylvain Devidal
Chef de projets Générix
Inscription : février 2010
Messages : 1 062
Détails du profil
Informations personnelles :
Nom : Homme Sylvain Devidal
Âge : 33
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Chef de projets Générix
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2010
Messages : 1 062
Points : 1 515
Points : 1 515
Je suis très étonné que ta requête fonctionne : normalement, tous les champs qui ne font pas partie d'une fonction de regroupement doivent être dans le "group by" (donc numéro de série et date).

Sinon, comme je te disais, il faut passer par une sous-requête.

Code :
1
2
3
4
5
6
7
8
9
SELECT `Numero Serie`, `Date Arrivee` 
FROM `main`
WHERE `Numero Serie` IN 
(
   SELECT `Numero Serie`
   FROM `main`
   GROUP BY `Numero Serie` 
   HAVING COUNT(`Numero Serie`) > 1
)
StringBuilder est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/09/2011, 17h29   #5
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 959
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 959
Points : 17 791
Points : 17 791
Citation:
Envoyé par StringBuilder Voir le message
Je suis très étonné que ta requête fonctionne : normalement, tous les champs qui ne font pas partie d'une fonction de regroupement doivent être dans le "group by" (donc numéro de série et date)
Cela fait partie des grosses M... de MySQL !

A lire : http://blog.developpez.com/sqlpro/p9...udre-aux-yeux/

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/09/2011, 17h36   #6
Invité de passage
 
Homme
Ingénieur Télécom
Inscription : septembre 2011
Messages : 5
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Ingénieur Télécom
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : septembre 2011
Messages : 5
Points : 0
Points : 0
Super!!!
C'est fou ce que j'apprends aujourd'hui!!
Ça fonctionne parfaitement ainsi.

Il ne reste qu'à améliorer les temps de réponse puisque ma base main contient pour l'instant 200 000 entrées et qu'elle va grossir très rapidement.
Actuellement sur un serveur de test avec mySQL, cette requête dure au moins 1/2h.

Aurais-tu quelques pistes?
morbli est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/09/2011, 17h42   #7
Invité de passage
 
Homme
Ingénieur Télécom
Inscription : septembre 2011
Messages : 5
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Ingénieur Télécom
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : septembre 2011
Messages : 5
Points : 0
Points : 0
je me réponds à moi même.
Je viens de lire le lien indiquer par sqlPro.
Je comprends que mySQL n'est pas forcément l'outil le plus adapté à mon besoin ne serait-ce qu'en terme de performance.
morbli est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/09/2011, 17h46   #8
Membre Expert
 
Homme
Responsable de service informatique
Inscription : janvier 2009
Messages : 1 092
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 38
Localisation : France

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Boutique - Magasin

Informations forums :
Inscription : janvier 2009
Messages : 1 092
Points : 1 898
Points : 1 898
Bonjour,
Tu peux essayer de remplacer le IN par une jointure:
Code SQL :
1
2
3
4
 
SELECT m1.`Numero Serie`, m2.`Date Arrivee` 
FROM `main` AS M1
INNER JOIN `main`AS m2 ON m1.`Numero Serie` = m2.`Numero Serie` AND m1.`Date Arrivee` <> m2.`Date Arrivee`

Tatayo.
tatayo est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 28/09/2011, 17h53   #9
Invité de passage
 
Homme
Ingénieur Télécom
Inscription : septembre 2011
Messages : 5
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Ingénieur Télécom
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : septembre 2011
Messages : 5
Points : 0
Points : 0
Citation:
Envoyé par tatayo Voir le message
Bonjour,
Tu peux essayer de remplacer le IN par une jointure:
Code SQL :
1
2
3
4
 
SELECT m1.`Numero Serie`, m2.`Date Arrivee` 
FROM `main` AS M1
INNER JOIN `main`AS m2 ON m1.`Numero Serie` = m2.`Numero Serie` AND m1.`Date Arrivee` <> m2.`Date Arrivee`

Tatayo.
alors là, chapeau!!!
Cette requête a duré moins de 5s.
Je vais maintenant la décortiquer pour essayer de comprendre. Ça risque de me prendre du temps.
morbli est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/09/2011, 09h19   #10
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 433
Points : 6 433
Citation:
Envoyé par SQLpro Voir le message
Cela fait partie des grosses M... de MySQL !

A lire : http://blog.developpez.com/sqlpro/p9...udre-aux-yeux/

A +
Autre lecture sur le sujet : http://cedric-duprez.developpez.com/...fier-group-by/
__________________
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 29/09/2011, 10h31   #11
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 959
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 959
Points : 17 791
Points : 17 791
Oui, jai lu cela avec attention. Il se trouve que je dispose des CD de la norme IOS SQL dans toutes ses versions depuis la 1999.

Or le papier est incomplet et la position de MySQL parfaitement irrespectueuse de la norme.

Effectivement la norme SQL permet depuis la v 1999 un GROUP BY sur clef (PRIMAIRE ou UNIQUE) permettant d’omettre d'autres colonnes.
mais cela fait partie des fonctionnalités avancées de la norme, c'est à dire que cette particularité ne doit être implémentée que dans le cadre ou le respect de la norme se fait en FULL LEVEL ! (Il y a 3 niveaux de conformité : ENTRY, INTERMEDIATE, FULL)

Or en matière de respect de la norme SQL, MySQL en n'est même pas au niveau SQL 2 de 1992 (pas de schéma SQL par exemple) et donc bien entendu pas au niveau 1999 ni au niveau FULL.
En comparaison, MS SQL Server se clame au niveau 2003, ENTRY...

Bref encore une fois MySQL fait du n'importe quoi et s'arrange à la façon qui lui plait en non en conformité avec la norme.

Aucun des grands éditeurs de SGBDR (Oracle, SQL Server, DB2 UDB, PostGreSQL...) n'a implémenté cette fonctionnalité qui n'a de sens que si tout le reste est déjà opérationnel !

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 29/09/2011, 11h56   #12
Membre éclairé
 
Avatar de boussafi
 
Homme
Ingénieur développement logiciels
Inscription : septembre 2007
Messages : 342
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Algérie

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Industrie

Informations forums :
Inscription : septembre 2007
Messages : 342
Points : 397
Points : 397
Envoyer un message via Yahoo à boussafi Envoyer un message via Skype™ à boussafi
Essayes aussi:
Code :
1
2
3
4
5
6
7
8
9
SELECT M1.`Numero Serie`, M1.`Date Arrivee`
FROM `main` AS M1
INNER JOIN
(
   SELECT `Numero Serie`
   FROM `main`
   GROUP BY `Numero Serie`
   HAVING COUNT(`Numero Serie`) > 1
)AS M2 ON M1.`Numero Serie`=M2.`Numero Serie`
boussafi est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h15.


 
 
 
 
Partenaires

Hébergement Web