Bonjour,
J'ai une table qui comporte cinq champs, avec des enregistrements en double, je souhaiterai réaliser un select qui va extraire les données des cinq champs sans doublons.
Merci
Bonjour,
J'ai une table qui comporte cinq champs, avec des enregistrements en double, je souhaiterai réaliser un select qui va extraire les données des cinq champs sans doublons.
Merci
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 select champ1, champ2, champ3, champ4, champ5 from ma_table group by champ1, champ2, champ3, champ4, champ5
Négatif
SELECT Matricule, Prénom, Nom, Grade, Division, CIN
FROM Table_IVP
GROUP BY Matricule, Prénom, Nom, Grade, Division, CIN
Ca m'affiche toujours des doublons, au fait je souhaiterai avoir les champs nom et prénom en distinct
Désolé mais pour moi ça fait SIX champs et vu votre demande succinct, comment j'aurais pu deviné les noms de colonnes ???
Apprenez à exprimer votre besoin clairement.
En premier, c'était les lignes distincts sur tous les 5 champs et maintenant, c'est sur 2 champs des 6...
Jusqu'à présent la télépathie ne marche pas très bien.
D'ailleurs, si vous aviez observé les règles du foru ( http://club.developpez.com/regles/ )
vous auriez du nous fournir un jeu d'exemples et de résultat attendu ainsi que la structure de la table et ça éviterait ce jeu de ping pong / devinettes.
Essayez ceci mais je ne vous empêche pas d'essayer de comprendre un peu et d'adapter ou d'essayer des choses...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 SELECT Prénom, Nom FROM Table_IVP GROUP BY Prénom, Nom
Négatif encore
Désolé, je reformule ma question :
J'ai une table qui comporte six champs :
Matricule Prénom Nom Grade Division CIN
1 Prénom1 Nom1 Grade1 Division1 CIN1
2 Prénom2 Nom2 Grade2 Division2 CIN2
3 Prénom3 Nom3 Grade3 Division3 CIN3
1 Prénom1 Nom1 Grade1 Division1 CIN1
1 Prénom1 Nom1 Grade1 Division1 CIN1
1 Prénom1 Nom1 Grade1 Division1 CIN1
2 Prénom2 Nom2 Grade2 Division2 CIN2
Je souhaiterai extraire les six champs avec des enregistrements non double de sorte à avoir le résultat ci-dessous :
Matricule Prénom Nom Grade Division CIN
1 Prénom1 Nom1 Grade1 Division1 CIN1
2 Prénom2 Nom2 Grade2 Division2 CIN2
3 Prénom3 Nom3 Grade3 Division3 CIN3
Votre première proposition du group by m'a donné un resultat avec doublons.
Votre deuxième proposition ne m'arrangera pas puisque j'ai besoin des six champs.
Vous dites : Essayez ceci mais je ne vous empêche pas d'essayer de comprendre un peu et d'adapter ou d'essayer des choses...
Belle expression
Ok, Merci
ça doit ça :
Effectivement, ce ne sont pas les tutoriels qui manquent concernant le SQL et les regroupements, rien que sur ce beau site...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 select Matricule , Prénom , Nom , Grade , Division , CIN from FROM Table_IVP group by Matricule , Prénom , Nom , Grade , Division , CIN
Et c'est toujours bien de comprendre ce que l'on fait, non ?
Outre la question mal posée, GROUP BY ne sert pas à filtrer les doublons, mais à retrouper les lignes.
Est donc plus appropriée comme réponse à la question initiale.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 select distinct champ1, champ2, champ3, champ4, champ5 from ma_table
Donc au final :
Quite à utiliser GROUP BY pour n'importe quoi, pourquoi pas utiliser UNION aussi, qui fait un DISTINCT implicite...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 SELECT DISTINCT Matricule , Prénom , Nom , Grade , Division , CIN FROM FROM Table_IVP
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 SELECT Matricule , Prénom , Nom , Grade , Division , CIN FROM FROM Table_IVP union SELECT Matricule , Prénom , Nom , Grade , Division , CIN FROM FROM Table_IVP
Excusez-moi, StringBuilder, je suis sûrement bien ignorant mais outre la différence de syntaxe entre
et
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 SELECT champ1, champ2, champ3, champ4, champ5 FROM ma_table GROUP BY champ1, champ2, champ3, champ4, champ5
C'est quoi la différence fondamentale ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 SELECT DISTINCT champ1, champ2, champ3, champ4, champ5 FROM ma_table
D'autant plus que les temps et les plans d’exécution sont identiques...
Pour moi, c'est une façon plus propre et plus explicite qu'un distinct.
En outre, je peux aussi fournir bien des exemples de SQL tarabiscotés mais il me semble que ma requête répond correctement à la demande, je ne comprends pas vraiment votre point.
Bonjour,
Si c'est un problème de qualité de données non detecté/bloqué par des contraintes d'intégrités, vous pouvez nettoyer vos data simplement !
Vous avez alors toutes les lignes en doublons, vous pouvez les purger et réinsérer les bonnes données.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 SELECT Ton_champs, COUNT(*) FROM Ta_Table GROUP BY Ton_champs HAVING COUNT(*)>1
Maintenant, moi j'ai fais un truc tout con :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 CREATE TABLE [dbo].[TABLE_TEST]( [MATRICULE] [int] NULL, [PRENOM] [varchar](50) NULL, [NOM] [varchar](50) NULL, [GRADE] [varchar](50) NULL, [DIVISION] [varchar](50) NULL, [CIN] [varchar](50) NULL ) ON [PRIMARY]
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 INSERT INTO TABLE_TEST ([MATRICULE],[PRENOM], [NOM], [GRADE], [DIVISION], [CIN]) VALUES (1, 'Prénom1', 'Nom1', 'Grade1', 'Division1', 'CIN1'); INSERT INTO TABLE_TEST ([MATRICULE],[PRENOM], [NOM], [GRADE], [DIVISION], [CIN]) VALUES (2, 'Prénom2', 'Nom2', 'Grade2', 'Division2', 'CIN2'); INSERT INTO TABLE_TEST ([MATRICULE],[PRENOM], [NOM], [GRADE], [DIVISION], [CIN]) VALUES (3, 'Prénom3', 'Nom3', 'Grade3', 'Division3', 'CIN3'); INSERT INTO TABLE_TEST ([MATRICULE],[PRENOM], [NOM], [GRADE], [DIVISION], [CIN]) VALUES (1, 'Prénom1', 'Nom1', 'Grade1', 'Division1', 'CIN1'); INSERT INTO TABLE_TEST ([MATRICULE],[PRENOM], [NOM], [GRADE], [DIVISION], [CIN]) VALUES (1, 'Prénom1', 'Nom1', 'Grade1', 'Division1', 'CIN1'); INSERT INTO TABLE_TEST ([MATRICULE],[PRENOM], [NOM], [GRADE], [DIVISION], [CIN]) VALUES (1, 'Prénom1', 'Nom1', 'Grade1', 'Division1', 'CIN1'); INSERT INTO TABLE_TEST ([MATRICULE],[PRENOM], [NOM], [GRADE], [DIVISION], [CIN]) VALUES (2, 'Prénom2', 'Nom2', 'Grade2', 'Division2', 'CIN2');
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 SELECT * FROM TABLE_TEST WHERE MATRICULE IN (SELECT DISTINCT(MATRICULE) FROM TABLE_TEST) GROUP BY [MATRICULE],[PRENOM], [NOM], [GRADE], [DIVISION], [CIN]
Voila
Bonjour,
Problème toujours pas résolu
Les trois réponses affichent ceci :
7gyY9w1ZY6ySRgPeaefZ :
StringBuilder :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 SELECT Matricule , Prénom , Nom , Grade , Division , CIN FROM Table_IVP GROUP BY Matricule , Prénom , Nom , Grade , Division , CIN
Glouferu :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 SELECT DISTINCT Matricule , Prénom , Nom , Grade , Division , CIN FROM Table_IVP
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 SELECT * FROM Table_IVP WHERE MATRICULE IN (SELECT DISTINCT(MATRICULE) FROM Table_IVP) GROUP BY [MATRICULE],[PRéNOM], [NOM], [GRADE], [DIVISION], [CIN]
Code : Sélectionner tout - Visualiser dans une fenêtre à part Matricule , Prénom , Nom , Grade , Division , CINAu fait, il manque un détail que je n'avais pas cité, et je m'en excuse profondément, c'est que les doublons d'enregistrements ne sont pas très identiques au niveau du champ grade.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 1111 Prénom1 Nom1 1 1 CIN1 1112 Prénom1 Nom1 1 1 CIN2 1113 Prénom3 Nom3 1 1 CIN3 1111 Prénom1 Nom1 2 1 CIN1 1111 Prénom1 Nom1 3 1 CIN1
Je souhaiterai avoir la liste des six champs avec un distinct sur les champs nom et le prénom seulement.
Si vous me dites, lequel des enregistrements en double je veux au final, je dirai ; n'importe lequel ...
Mes remerciements
Oui, si la valeur Grade est différente ... les lignes ne sont pas en doublons
Bon pour ma part, je pense que le grade le plus élevé est celui en rigueur faute de date !
Voici ce que ça donne :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 SELECT * FROM TABLE_TEST AS T, (SELECT MATRICULE, max(GRADE) as grade FROM TABLE_TEST GROUP BY MATRICULE) A WHERE A.MATRICULE = T.MATRICULE AND A.GRADE=T.GRADE
P.S.: Avec les 2 3 exemples de requêtes SQL que j'ai pu vous donner sur ce topic, vous allez pouvoir répondre a 90% des besoins en matières de sélection. Donc essayez de bien comprendre la logique et tout deviendra plus simple pour vous
Problème résolu
Glouferu, votre solution est bien correct, juste un petit détail ; vu qu'un max grade d'une personne risque d'être en double aussi, le max ne fonctionnera pas, j'ai pensé alors a créer un id unique pour tout les enregistrement que j'ai, et je récupère le max ou le min id d'une personne puisque c'est un enregistrement au hasard qui m'intéresse.
Je vous remercie énormément.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 SELECT Mat , Prénom , Nom , Grade , Division , CIN FROM IVP AS T , (SELECT MAX(id) AS id FROM IVP GROUP BY Prénom, Nom ) A WHERE T.ID = A.ID
Salutations
La différence fondamentale, c'est que "distinct" retourne toutes les valeurs distinctes des tuples retournés par le select.
Alors que group by effectue un regroupement des lignes en vue d'une utilisation conjointe avec une fonction de regroupement (min, max, etc.)
Le fait que GROUP BY faisse un distinct est un effet de bord uniquement, et il ne doit jamais être utilisé pour ça. C'est comme les gens qui croient que le GROUP BY et le ORDER BY sont synonymes : le ORDER BY est un effet de bord du GROUP BY et du DISTINCT. Cependant, ce n'est pas systématique (lors d'une jointure noramment, l'ordre n'est pas toujours assuré) !
Il s'agit donc d'une différence de sémantique.
Non, justement, puisque sémantiquement, il faut utiliser DISTINCT pour avoir des valeurs distinctes et GROUP BY pour avoir des valeurs groupées
Le fait que le plan d'exécution et le résultat soit identique n'est qu'un "coup de chance" parceque pour un SGBD donné, dans une situation donnée, il va faire la même chose. Cela n'est en rien assuré.
A la place de rajouter une nouvelle colonne à ta table, tu peux la créer aussi en mémoire pour ton traitement. Je te laisse regarder la fonction :
Code : Sélectionner tout - Visualiser dans une fenêtre à part ROW_NUMBER()
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager