WDForge - Forum

Le forum des développeurs professionnels WinDev ®

REQUETE AVEC GROUP BY SUR PLUSIEURS CHAMPS

Discussion sur WinDev®

Message non lupar SBPROD » Jeu 23 Mar 2017 13:41

Bonjours amis de windev j'ai un petit problème une requete
j'ai une table MEMBRE(id_membr,matricule_membr,nom_membr,prenon,dtn_membr,contact_membr...) DECES (id_decès, matricule_decès, nom_decès,prenom_dècès...) PARTICIPATION (id_particip, matricule_membr, matricule_decès,montant_particip,nom_decès,prenom_dècès...)

comment ça se passe:
chaque membre participe à chaque décès, Exemple

MEMBRE
id matricule nom prenom
1 YAS123 YAO KOUASSI ANTOINE
2 ADSZ3 ADOU ANON ANGE
3 KDAE1 KONATE AMINATA

TABLE DECES
id matricule nom prenom
1 MKO34 M'BRA KOUASSI GEORGES
2 AMR50 AMARA KOFFI LEONCE
3 BRU45 BROU MARIE ANNE

TABLE PARTICIPATION
id mat_mem mat_deces nom_deces prenom_decès
1 YAS123 MKO34 M'BRA KOUASSI GEORGES
2 ADSZ3 MKO34 M'BRA KOUASSI GEORGES
3 ADSZ3 BRU45 BROU MARIE ANNE
4 ADSZ3 AMR50 AMARA KOFFI LEONCE
5 KDAE1 BRU45 BROU MARIE ANNE

Dans ma requete 1 je souhaiterais recupperer par exemple la liste des personne décédés pour lesquelle YAO KOUASSI ANTOINE a perticipé au décès et la ma requete ça marche sans problème

MON VRAI PROBLEME EST DE TROUVER TOUS LES DECES DONT YAO KOUASSI ANTOINE N'A PAS PARTICIPE ET LES RECUPERER DANS UNE TABLE

QUAND JE FAIS MA REQUETE VOICI MA REPONSE . MOI JE VEUX PAS CA

2 ADSZ3 MKO34 M'BRA KOUASSI GEORGES
3 KDAE1 BRU45 BROU MARIE ANNE
4 ADSZ3 AMR50 AMARA KOFFI LEONCE
5 ADSZ3 BRU45 BROU MARIE ANNE

JE VEUX CA
mat_deces nom_deces prenom_decès
MKO34 M'BRA KOUASSI GEORGES
BRU45 BROU MARIE ANNE
AMR50 AMARA KOFFI LEONCE
SBPROD
Stagiaire WDF
 
Messages: 2
Enregistré le: Jeu 23 Mar 2017 12:27

Message non lupar gwennhadu » Jeu 23 Mar 2017 18:46

Bonjour,

Si j'ai bien compris, vous avez réussi à construire une requête permettant d'obtenir les décès auxquels a participé un membre.

Donc si vous voulez les décès auxquels un membre n'a pas participé , alors vous avez déjà quasiment la réponse ;) il suffit d'inverser habilement la condition de sélection.

Exemple : en SQL votre requête donnant les décès peut être quelque chose du genre (on n'utilisera pas INNER JOIN) :

Code: Tout sélectionner
SELECT DECES.matricule_deces,DECES.nom,DECES.prenom
FROM DECES, PARTICIPATION, MEMBRE
WHERE DECES.matricule_deces = PARTICIPATION.matricule_deces // jointure à la main
AND PARTICIPATION.matricule_membre = MEMBRE.matricule_membre // idem
AND MEMBRE.matricule_membre = '<le matricule de YAO KOUASSI>' // la restriction sur un matricule de membre


Il n'y a qu'à inverser la dernière clause :

Code: Tout sélectionner
SELECT DISTINCT DECES.matricule_deces,DECES.nom,DECES.prenom // rajout d'un distinct pou éviter les doublons dans la réponse
FROM DECES, PARTICIPATION, MEMBRE
WHERE DECES.matricule_deces = PARTICIPATION.matricule_deces
AND PARTICIPATION.matricule_membre = MEMBRE.matricule_membre
AND MEMBRE.matricule_membre <> '<le matricule de YAO KOUASSI>' // on ne veut pas ce matricule de membre dans les résultats


Bon développement !
gwennhadu
Stagiaire WDF
 
Messages: 11
Enregistré le: Mar 30 Juin 2015 12:13

Message non lupar SBPROD » Ven 24 Mar 2017 01:58

Merci mon frère pour ta reponse mais en faite j 'ai tout cela mais le probleme est que
si COMME MEMBRE
YAO JULES
KOUASSI ARISTIDE
SEKA JEROME.....
toutes ces personne participe au décès de Monsieur KOYATE ALIDOU tu vera que la requete va me renvoyer 3 fois aussi le nom de Monsieur KOYATE ALIDOU alors que je voudrai que le nom s'affiche une seule fois dans la table (c'est a dire une ligne) pour que je sache simplement que Monsieur X n'a pas participer au décès de Monsieur KOYATE ALIDOU et
YAO JULES
KOUASSI ARISTIDE
SEKA JEROME..... ont participé
voilà mon problème
SBPROD
Stagiaire WDF
 
Messages: 2
Enregistré le: Jeu 23 Mar 2017 12:27

Message non lupar gwennhadu » Ven 24 Mar 2017 11:57

Je me suis relu et j'ai écris une bêtise :oops: .

Je reformule : ce qu'il te faut c'est la liste de TOUS les décès QUI NE SONT PAS PARMI les décès auxquels a participé YAO KOUASSI.

Pour ça une sous-requête est nécessaire avec l'utilisation de NOT IN :

Code: Tout sélectionner
SELECT * FROM DECES
WHERE DECES.matricule_deces NOT IN (
// sous-requête : les décès auxquels a participé YAO KOUASSI
    SELECT DECES.matricule_deces
   FROM DECES, PARTICIPATION
    WHERE DECES.matricule_deces = PARTICIPATION.matricule_deces AND PARTICIPATION.matricule_membr = '<le matricule de YAO KAOUASSI>')
gwennhadu
Stagiaire WDF
 
Messages: 11
Enregistré le: Mar 30 Juin 2015 12:13

Message non lupar EMIDEV » Mer 10 Mai 2017 09:14

Bonjour,

pour cela il faut utiliser une joinbture ouverte (la meme chose que le not in mais plus rapide, et plus efficace)
en fait en faisant des jointure ouverte vous prenez les lignes de deces liéé ou non a participation liée ou non a memebre.
ensuite dans le where on elimine les lignes qu'on ne veut pas voir ici les ligne dans le matricule est celui cherché ce qui fera que ne resteront que les lignes qu'on cherche:

Code: Tout sélectionner
SELECT DISTINCT DECES.matricule_deces,DECES.nom,DECES.prenom // rajout d'un distinct pou éviter les doublons dans la réponse
FROM
   DECES
   LEFT PARTICIPATION    ON DECES.matricule_deces = PARTICIPATION.matricule_deces
   LEFT MEMBRE       ON PARTICIPATION.matricule_membre = MEMBRE.matricule_membre AND MEMBRE.matricule_membre <> '<le matricule de YAO KOUASSI>'
WHERE
   MEMBRE.id is null


attention si on met dans un where une condition sur une table liée (mis a part is null) on casse le left join et cela revient a faire un inner join

a tester pour savoir si le resultat est correcte ou non ou a affiner
j'ai passé une requete de 40 minutes pleine de not in (select ......) avec des left join particuliers : resultat la requete met 5 secondes maintenant soit presque 500 fois plus rapide

bon dev
@+
EMIDEV
Animateur WDForge
 
Messages: 16
Enregistré le: Mer 6 Jan 2016 14:23


Retourner vers WinDev

cron