Assembler le résultat de deux requetes sur une seule ligne

Assembler le résultat de deux requetes sur une seule ligne - SQL/NoSQL - Programmation

Marsh Posté le 06-10-2005 à 09:30:42    

J'ai deux requêtes sur une même table.
Dans l'une d'elle, je détermine le nombre de documents par pays.
Très basique :

Code :
  1. select country,count(*)
  2. from base.documents
  3. group by country


Dans la seconde, je détermine le nombre de doublons de documents par pays, dans mon cas ça peut arriver d'avoir des entrées en doublon.

Code :
  1. select country,count(*)
  2. from base.documents
  3. where cle1 in
  4.         (select cle1 from (
  5.           select distinct cle1,cle2,count(*) as n
  6.           from base.documents
  7.           group by cle1,cle2
  8.           having n>1 ) ListDups1
  9.         ) and
  10.       cle2 in
  11.         (select cle2 from (
  12.           select distinct cle1,cle2,count(*) as n
  13.           from base.documents
  14.           group by cle1,cle2
  15.           having n>1 ) ListDups2
  16.         )
  17. group by country


Ma question principale est donc est-ce qu'on peut joindre les deux requetes, j'ai employé le terme joindre, parce que je sens que le mot clé JOIN dans ce cas est mon ami, mais j'ai un peu de mal à l'utiliser... :pfff:  
Dans un deuxième temps, si quelqu'un a une idée pour simplifier la deuxième requete, parce qu'elle fait deux fois le même select en changeant simplement ce qui est extrait (cle1/cle2). :heink:  
 
Petite précision : Je n'ai pas systématiquement de doublon pour chaque pays, donc le nombre de lignes retournées n'est pas le même pour chaque requete, je ne sais pas si c'est important.

Reply

Marsh Posté le 06-10-2005 à 09:30:42   

Reply

Marsh Posté le 06-10-2005 à 09:40:39    

peut etre :

Code :
  1. select A.country,A.compte as Documents,B.compte as doublons
  2. FROM
  3. (select country,count(*) as Compte
  4. from base.documents
  5. group by country) A LEFT JOIN
  6. (select country,count(*) as Compte
  7. from base.documents
  8. where cle1 in
  9.         (select cle1 from (
  10.           select distinct cle1,cle2,count(*) as n
  11.           from base.documents
  12.           group by cle1,cle2
  13.           having n>1 ) ListDups1
  14.         ) and
  15.       cle2 in
  16.         (select cle2 from (
  17.           select distinct cle1,cle2,count(*) as n 
  18.           from base.documents
  19.           group by cle1,cle2 
  20.           having n>1 ) ListDups2
  21.         )
  22. group by country
  23. ) B on A.country=B.country


 
EDIT : si ton SGBD te le permet


Message édité par betsamee le 06-10-2005 à 09:42:47
Reply

Marsh Posté le 06-10-2005 à 09:50:23    

Merci beaucoup, ça marche nickel, j'ai des NULL là où j'ai pas de doublons, mais ça me va très bien.
En plus, j'ai compris la manip, ce qui était le but aussi :) Je vais pouvoir décliner la chose, j'ai d'autres requetes du style.
 
J'avais oublié de préciser que je travaille avec MySQL.
 
Sinon, pour la double requête (cerise sur le gateau) y aurait rien à faire ?

Reply

Marsh Posté le 06-10-2005 à 09:53:58    

louborg a écrit :

Merci beaucoup, ça marche nickel, j'ai des NULL là où j'ai pas de doublons, mais ça me va très bien.
En plus, j'ai compris la manip, ce qui était le but aussi :) Je vais pouvoir décliner la chose, j'ai d'autres requetes du style.
 
J'avais oublié de préciser que je travaille avec MySQL.
 
Sinon, pour la double requête (cerise sur le gateau) y aurait rien à faire ?


je n'ai pas trop le temps de m'y pencher (j'ai un peu de boulot moi aussi  :D ) mais je le ferais des que j'aurais 5 minutes  
en attendant un excellent article sur la gestion des doublons

Reply

Marsh Posté le 06-10-2005 à 12:18:52    

Pour la simplification de la 2ème requête :
 

Code :
  1. select country,count(*)
  2. from base.documents d1,
  3.      (select cle1,cle2,count(*) as n 
  4.       from base.documents
  5.       group by cle1,cle2 
  6.       having n>1) d2
  7. where d1.cle1 = d2.cle1
  8. and d1.cle2 = d2.cle2
  9. group by country;


 
Non ?

Message cité 1 fois
Message édité par Beegee le 06-10-2005 à 12:19:18
Reply

Marsh Posté le 06-10-2005 à 14:45:52    

Beegee a écrit :

Pour la simplification de la 2ème requête :
 

Code :
  1. select country,count(*)
  2. from base.documents d1,
  3.      (select cle1,cle2,count(*) as n 
  4.       from base.documents
  5.       group by cle1,cle2 
  6.       having n>1) d2
  7. where d1.cle1 = d2.cle1
  8. and d1.cle2 = d2.cle2
  9. group by country;


 
Non ?


Je serais effectivement tenté de dire que oui...
C'est bizarre, parce que ta requête me semble bonne, mais je n'obtiens pas le même résultat...
Avec mes données actuelles, ma req donne 171 doublons pour le pays FR et ta version 170 seulement. Par contre pour les 17 autres pays où des doblons existent, le résultat est bon (en général <15, ce qui explique peut être).
Ca fait plus de 10 ans que j'avais pas fait de SQL... j'en avais oublié toute la puissance  :)  
 
Je vais détailler les résultats lignes par ligne pour FR et essayer de comprendre la différence entre les deux requetes... Je pencherai d'ailleurs pour une erreur chez moi, la tienne étant plus simple et moins sujette à effet de bord :)

Reply

Marsh Posté le 06-10-2005 à 14:57:32    

fais :
 
ta requête
MINUS
ma requête
 
comme ça tu verras la différence.
 
edit : en fait, je pense savoir. Ma requête renvoie les pays dont les 2 clés, ensembles, ont plus d'un pays. La tienne renvoie les pays pour lesquels les 2 clés, indépendamment, ont plus d'un pays.
 
Remplace le AND dans ma requête par un OR et vois ce que ça donne (ça devrait alors coincider avec la tienne ;) ).
 

Code :
  1. select country,count(*) 
  2. from base.documents d1,
  3.      (select cle1,cle2,count(*) as n 
  4.       from base.documents 
  5.       group by cle1,cle2 
  6.       having n>1) d2
  7. where d1.cle1 = d2.cle1
  8. or d1.cle2 = d2.cle2
  9. group by country;


Message édité par Beegee le 06-10-2005 à 15:00:19
Reply

Marsh Posté le 06-10-2005 à 15:00:47    

minus marche pas avec MySQL (me tromperais-je?[:petrus75])

Reply

Marsh Posté le 06-10-2005 à 15:02:52    

rhâââ ce mySql relou :D
 
edit : et puis ma nouvelle requête avec le OR est foireuse, on compte plusieurs fois les mêmes lignes ... pffff.
 
Ce serait pas mal louborg que tu dises en français ce que tu veux faire, pour repartir de zéro :)

Message cité 1 fois
Message édité par Beegee le 06-10-2005 à 15:04:23
Reply

Marsh Posté le 06-10-2005 à 15:32:26    

Beegee a écrit :

rhâââ ce mySql relou :D
 
edit : et puis ma nouvelle requête avec le OR est foireuse, on compte plusieurs fois les mêmes lignes ... pffff.
 
Ce serait pas mal louborg que tu dises en français ce que tu veux faire, pour repartir de zéro :)


 
Mon sujet exposé simplement :
J'ai une table avec un ensemble d'enregistrement, que du classique :)
J'ai deux identifiants de personnes (cle1/cle2) associés à chaque enregistrement ainsi qu'un code pays, plus d'autres infos qui ne nous intéressent pas ici.
Je ne dois normalement jamais avoir deux enregistrements avec le même couple cle1/cle2 (on ne se préoccupe pas ici du pays).
Si c'est le cas, je veux les lister (par pays), because au final ce sont des stats qui doivent être générées par pays.
 
Donc, si j'ai deux enregistrement avec cle1/cle2 identique, c'est à comptabiliser.
Ce qui me plairait serait d'avoir uniquement dans le décompte qu'un des couples en double et non pas le total des occurences, mais ce n'est pas primordial.
 
 
Dans un second temps, qui ne nous intéresse pas ici, quasiment à la main, je prends les doublons, les examine et détermine lequel virer, c'est trop sensible pour les virer automatiquement :( à mon grand regret.
 
 

Reply

Marsh Posté le 06-10-2005 à 15:32:26   

Reply

Marsh Posté le 06-10-2005 à 15:48:11    

je pense que

Code :
  1. select country,count(*) as nb
  2. from base.documents
  3. group by country,cle1,cle2
  4. having nb>1


te donne les doublons que tu recherche

Message cité 1 fois
Message édité par betsamee le 06-10-2005 à 15:48:50
Reply

Marsh Posté le 06-10-2005 à 16:33:54    

betsamee a écrit :

je pense que

Code :
  1. select country,count(*) as nb
  2. from base.documents
  3. group by country,cle1,cle2
  4. having nb>1


te donne les doublons que tu recherche


désolé  :(  mais non...
exemple de ce que j'obtiens (quelques lignes seulement) :
'AT', 2
'AU', 2
'BR', 2
'BR', 2
'BR', 2
'BR', 2
'CN', 2
'CN', 2
'CN', 2
'CN', 2
'CN', 2
'CN', 2
'DE', 2
 
Sinon, j'ai fait mon delta ente ma req et la tienne...
Sans surprise, la mienne était foireuse...
Je m'explique:
Ma requete ne demandait pas à avoir cle1/cle2 sur la même ligne alors que la tienne oui... donc la bonne solution est bien :

Code :
  1. select country,count(*) 
  2. from base.documents d1,
  3.     (select cle1,cle2,count(*) as n 
  4.      from base.documents 
  5.      group by cle1,cle2 
  6.      having n>1) d2
  7. where d1.cle1 = d2.cle1
  8. and d1.cle2 = d2.cle2
  9. group by country;


 
J'ai voulu faire compliqué :(
 
Merci encore à tous pour votre coup de main, quelle efficacité   :D

Reply

Sujets relatifs:

Leave a Replay

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