[SQL] Afficher la liste des doublons...

Afficher la liste des doublons... [SQL] - SQL/NoSQL - Programmation

Marsh Posté le 21-01-2005 à 15:27:37    

Bonjour à tous,
 
Admettons que nous ayons cette table :
 
ID |   NOM   | DATE NAISSANCE
1  |  LAVIT  |    12/10/04
2  |  TOTOT  |    08/11/02
3  |  LAFAL  |    09/04/98
4  |  TOTOO  |    08/11/02
 
Nous aimerions ressortir toutes les personnes susceptibles d'être des doublons.
 
Les conditions sont "doublon sur date de naissance" ET "doublon sur 1ere lettre du nom".
 
Bon j'ai simplifié hein, note table est bien plus complexe, mais bon...
 
Comment faire pour avoir ce resultat :
 
ID |   NOM   | DATE_NAISSANCE
2  |  TOTOT  |    08/11/02
4  |  TOTOO  |    08/11/02
 
Ca me paraissait très con, mais je n'y arrive pas :/
 
J'ai donc dans un premier temps juste essayé de ressortir uniquement la liste des dates de naissance qui apparaissent plusieurs fois. Dans ce cas j'aurais obtenu :
 
 DATE_NAISSANCE
    08/11/02
 
Mais comment faire pour obtenir les nom qui vont avec (sans s'occuper de la 1ere lettre pour le moment) ?
 
Je ne sais pas si je suis assez clair :( J'ai du mal a expliquer vraiment le resultat que je veux ...
 
Merci par avance.


Message édité par Dj YeLL le 21-01-2005 à 15:52:50
Reply

Marsh Posté le 21-01-2005 à 15:27:37   

Reply

Marsh Posté le 21-01-2005 à 15:51:07    

Si je fais ça :
 
SELECT date_naissance, count(*)
FROM ma_table
GROUP BY date_naissance
HAVING count(*) > 1
 
Il m'affiche ça :
 


DATE NAISSANCE | COUNT(*)
   08/11/02    |    2


 
Moi je voudrais un truc dans ce genre :
 


DATE NAISSANCE |  NOM  | COUNT(*)
   08/11/02    | TOTOT |   2
   08/11/02    | TOTOO |   2


 
Enfin un truc dans le genre.

Reply

Marsh Posté le 21-01-2005 à 16:01:40    

Je viens de tester ça aussi, qui me semblait pas mal :
 

Code :
  1. SELECT id
  2. FROM ma_table
  3. GROUP BY id
  4. HAVING count(date_naissance)>1;


 
Mais ça me retourne :
 
no rows selected
 
Edit :
 
J'ai fais d'autres tests :
 

SQL> SELECT id
  2  FROM ma_table
  3  HAVING count(date_naissance) > 1;
SELECT id
       *
ERROR at line 1:
ORA-00937: not a single-group group function


 
 

SQL> SELECT id
  2  FROM ma_table
  3  WHERE count(date_naissance) > 1;
WHERE count(date_naissance) > 1
      *
ERROR at line 3:
ORA-00934: group function is not allowed here


Message édité par Dj YeLL le 21-01-2005 à 16:06:52
Reply

Marsh Posté le 21-01-2005 à 19:35:35    

SELECT date_naissance, MIN ( Nom ), COUNT(*)
FROM ma_table  
GROUP BY date_naissance  
HAVING count(*) > 1


Message édité par WhyMe le 21-01-2005 à 19:36:20
Reply

Marsh Posté le 21-01-2005 à 20:59:22    

Merci beaucoup :)
 
Je testerais ça dès lundi, de retour au taff ^^
 
++


---------------
Gamertag: CoteBlack YeLL
Reply

Marsh Posté le 21-01-2005 à 22:59:25    

Quel SGBD ?
 
Si tu peux faire des requêtes imbriquées, essaye qqch comme :
 

Code :
  1. SELECT ID, NOM, DATE_NAISSANCE, NUMBER
  2. FROM ma_table t1,
  3.      (SELECT DATE_NAISSANCE,
  4.              SUBSTR(NOM, 1, 1) AS PREMIERE_LETTRE,
  5.              COUNT(*) AS COMPTEUR
  6.       FROM ma_table
  7.       GROUP BY DATE_NAISSANCE, SUBSTR(NOM, 1, 1)
  8.       HAVING count(*) > 1) t2
  9. WHERE t1.date_naissance = t2.date_naissance
  10. AND SUBSTR(t1.NOM, 1, 1) = t2.PREMIERE_LETTRE;

Reply

Marsh Posté le 22-01-2005 à 15:28:12    

+1

Reply

Marsh Posté le 23-01-2005 à 19:55:49    

SGBD : Je pense que ça doit être Oracle si je dis pas de connerie...
 
Merci pour l'info, je testerais :)
 
++


---------------
Gamertag: CoteBlack YeLL
Reply

Marsh Posté le 24-01-2005 à 11:46:49    

Beegee a écrit :

Quel SGBD ?
 
Si tu peux faire des requêtes imbriquées, essaye qqch comme :
 

Code :
  1. SELECT ID, NOM, DATE_NAISSANCE, NUMBER
  2. FROM ma_table t1,
  3.      (SELECT DATE_NAISSANCE,
  4.              SUBSTR(NOM, 1, 1) AS PREMIERE_LETTRE,
  5.              COUNT(*) AS COMPTEUR
  6.       FROM ma_table
  7.       GROUP BY DATE_NAISSANCE, SUBSTR(NOM, 1, 1)
  8.       HAVING count(*) > 1) t2
  9. WHERE t1.date_naissance = t2.date_naissance
  10. AND SUBSTR(t1.NOM, 1, 1) = t2.PREMIERE_LETTRE;



 
Je me pose une question ... dans le 1er SELECT tu parles d'un "NUMBER", il sort d'où ? Ne voulais tu pas dire "COMPTEUR" à la place ? Tel qu'il est present dans le 2eme SELECT (...AS COMPTEUR) ?
 
Merci.
 
Je n'ai pas l'occasion de tester ce matin, je testerais cet après-midi :)

Reply

Marsh Posté le 24-01-2005 à 11:47:49    

t2.compteur en effet :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed