Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1178 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1216155
louborg
Posté le 06-10-2005 à 09:30:42  profilanswer
 

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.

mood
Publicité
Posté le 06-10-2005 à 09:30:42  profilanswer
 

n°1216160
betsamee
Asterisk Zeperyl
Posté le 06-10-2005 à 09:40:39  profilanswer
 

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
n°1216172
louborg
Posté le 06-10-2005 à 09:50:23  profilanswer
 

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 ?

n°1216173
betsamee
Asterisk Zeperyl
Posté le 06-10-2005 à 09:53:58  profilanswer
 

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

n°1216431
Beegee
Posté le 06-10-2005 à 12:18:52  profilanswer
 

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
n°1216632
louborg
Posté le 06-10-2005 à 14:45:52  profilanswer
 

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 :)

n°1216656
Beegee
Posté le 06-10-2005 à 14:57:32  profilanswer
 

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
n°1216661
betsamee
Asterisk Zeperyl
Posté le 06-10-2005 à 15:00:47  profilanswer
 

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

n°1216665
Beegee
Posté le 06-10-2005 à 15:02:52  profilanswer
 

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
n°1216712
louborg
Posté le 06-10-2005 à 15:32:26  profilanswer
 

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.
 
 

mood
Publicité
Posté le 06-10-2005 à 15:32:26  profilanswer
 

n°1216739
betsamee
Asterisk Zeperyl
Posté le 06-10-2005 à 15:48:11  profilanswer
 

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
n°1216799
louborg
Posté le 06-10-2005 à 16:33:54  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

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

 

Sujets relatifs
aide boutique en ligneProbleme pour sauter une ligne (\n ;\r\n....)
ptite aide gawk pour afficher la ligne que je veuximprimer pdf en ligne de commande
compte le nombre de ligneGestion des options/ parametres en ligne de commande
[Shell] lecture d'un fichier txt ligne par ligneComment garder le retour à la ligne d'un TEXTAREA ??
Additionner les résultat de deux requêtes SQL en access SQL 
Plus de sujets relatifs à : Assembler le résultat de deux requetes sur une seule ligne


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR