Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

LEFT, RIGHT, INNER JOIN ?

10 réponses
Avatar
Kolonna
Bonjour à tous,

J'ai actuellement 2 requêtes dont j'aimerai regrouper les résultats en 1
seul tableau.

Requête 1:
Mois Champs X
01/02 3
02/02 4
03/02 1
04/02 0

Requête 2:
Mois Champs Y
02/02 1
03/02 2
04/02 3
05/02 1

Comment faire à partir d'une nouvelle requête pour obtenir le tableau suivant:

Nouvelle requête
Mois Champs X Champs Y
01/02 3 0
02/02 4 1
03/02 1 2
04/02 0 3
05/02 0 1

J'arrive à rappatrier les données d'une requête vers l'autre (via LEFT ou
RIGHT JOIN) mais pas les 2 en même temps!

Merci pour vos conseils,
Kolonna.

10 réponses

Avatar
Eric
Bonjour Kolonna

Avec une requête UNION reposant sur une jointure Right ET Left entre tes
2 tables/requêtes, la jointure totale externe(FULL OUTER) n'existant pas
sous Access.

Un truc du genre :

SELECT r1.Mois, nz(r1.nb,0) as X,nz(r2.nb,0) as Y
FROM r1 LEFT JOIN r2 ON r1.Mois = r2.Mois;
UNION
SELECT r2.Mois, nz(r1.nb,0),nz(r2.nb,0)
FROM r1 RIGHT JOIN r2 ON r1.Mois = r2.Mois;

Ok ?

A+
Eric

news::

Bonjour à tous,

J'ai actuellement 2 requêtes dont j'aimerai regrouper les résultats
en 1 seul tableau.

Requête 1:
Mois Champs X
01/02 3
02/02 4
03/02 1
04/02 0

Requête 2:
Mois Champs Y
02/02 1
03/02 2
04/02 3
05/02 1

Comment faire à partir d'une nouvelle requête pour obtenir le
tableau suivant:

Nouvelle requête
Mois Champs X Champs Y
01/02 3 0
02/02 4 1
03/02 1 2
04/02 0 3
05/02 0 1

J'arrive à rappatrier les données d'une requête vers l'autre (via
LEFT ou RIGHT JOIN) mais pas les 2 en même temps!

Merci pour vos conseils,
Kolonna.





Avatar
Kolonna
Merci Eric !!
Ca fonctionne très bien en effet.
Par contre comment gérer le tri maintenant ?
J'ai lu sur ce forum qu'une requête UNION ne pouvait pas gérer 2 ORDER BY ?
J'ai besoin de classer ces mois par ordre chronologique. Dans mes 2 requêtes
principales j'utilise Format(r1.mois,"#"), mais en UNION, je vois pas trop
comment gérer...

Merci d'avance!!


"Eric" wrote:

Bonjour Kolonna

Avec une requête UNION reposant sur une jointure Right ET Left entre tes
2 tables/requêtes, la jointure totale externe(FULL OUTER) n'existant pas
sous Access.

Un truc du genre :

SELECT r1.Mois, nz(r1.nb,0) as X,nz(r2.nb,0) as Y
FROM r1 LEFT JOIN r2 ON r1.Mois = r2.Mois;
UNION
SELECT r2.Mois, nz(r1.nb,0),nz(r2.nb,0)
FROM r1 RIGHT JOIN r2 ON r1.Mois = r2.Mois;

Ok ?

A+
Eric

news::

Bonjour à tous,

J'ai actuellement 2 requêtes dont j'aimerai regrouper les résultats
en 1 seul tableau.

Requête 1:
Mois Champs X
01/02 3
02/02 4
03/02 1
04/02 0

Requête 2:
Mois Champs Y
02/02 1
03/02 2
04/02 3
05/02 1

Comment faire à partir d'une nouvelle requête pour obtenir le
tableau suivant:

Nouvelle requête
Mois Champs X Champs Y
01/02 3 0
02/02 4 1
03/02 1 2
04/02 0 3
05/02 0 1

J'arrive à rappatrier les données d'une requête vers l'autre (via
LEFT ou RIGHT JOIN) mais pas les 2 en même temps!

Merci pour vos conseils,
Kolonna.









Avatar
Eric
Bonjour Kolonna,

Une seule clause Order By sur une requête Union.
Tu mets le Order by à la fin du SQL et le tri se fera correctement sur le
mois.
Une requête Union portant sur des schémas de relation identique (meme
structure), cela te retournera les tuples dans le bon ordre. (Si mes
souvenirs sont bons)

SELECT r1.Mois, nz(r1.nb,0) as X,nz(r2.nb,0) as Y
FROM r1 LEFT JOIN r2 ON r1.Mois = r2.Mois
UNION SELECT r2.Mois, nz(r1.nb,0),nz(r2.nb,0)
FROM r1 RIGHT JOIN r2 ON r1.Mois = r2.Mois
Order by mois;


A+
Eric


"=?Utf-8?B?S29sb25uYQ==?=" écrivait
news::

Merci Eric !!
Ca fonctionne très bien en effet.
Par contre comment gérer le tri maintenant ?
J'ai lu sur ce forum qu'une requête UNION ne pouvait pas gérer 2
ORDER BY ? J'ai besoin de classer ces mois par ordre chronologique.
Dans mes 2 requêtes principales j'utilise Format(r1.mois,"#"), mais
en UNION, je vois pas trop comment gérer...

Merci d'avance!!




Avatar
Kolonna
Eric,

Qu'entends tu par ORDER BY mois ?
J'ai 2 mois, r1.mois et r2.mois.
J'arrive à classer r1 et r2 chronologiquement mais pas les 2 ensembles...
Est ce que j'ai raté un truc ?

Merci!



Bonjour Kolonna,

Une seule clause Order By sur une requête Union.
Tu mets le Order by à la fin du SQL et le tri se fera correctement sur le
mois.
Une requête Union portant sur des schémas de relation identique (meme
structure), cela te retournera les tuples dans le bon ordre. (Si mes
souvenirs sont bons)

SELECT r1.Mois, nz(r1.nb,0) as X,nz(r2.nb,0) as Y
FROM r1 LEFT JOIN r2 ON r1.Mois = r2.Mois
UNION SELECT r2.Mois, nz(r1.nb,0),nz(r2.nb,0)
FROM r1 RIGHT JOIN r2 ON r1.Mois = r2.Mois
Order by mois;


A+
Eric


"=?Utf-8?B?S29sb25uYQ==?=" écrivait
news::

Merci Eric !!
Ca fonctionne très bien en effet.
Par contre comment gérer le tri maintenant ?
J'ai lu sur ce forum qu'une requête UNION ne pouvait pas gérer 2
ORDER BY ? J'ai besoin de classer ces mois par ordre chronologique.
Dans mes 2 requêtes principales j'utilise Format(r1.mois,"#"), mais
en UNION, je vois pas trop comment gérer...

Merci d'avance!!







Avatar
Eric
re,

Tu ne peux classer que sur les champs du 1er SELECT de ta requête UNION
donc essaies avec ORDER BY r1.mois.

Ta clause Order by tu peux la mettre à la fin du 1er SQL avant Union ou à
la fin. Ca n'a pas d'incidence.

je viens de faire un test sur 2 tables et je n'ai pas le problème que tu
soulèves.

A+
Eric



"=?Utf-8?B?S29sb25uYQ==?=" écrivait
news::

Eric,

Qu'entends tu par ORDER BY mois ?
J'ai 2 mois, r1.mois et r2.mois.
J'arrive à classer r1 et r2 chronologiquement mais pas les 2
ensembles... Est ce que j'ai raté un truc ?

Merci!



Bonjour Kolonna,

Une seule clause Order By sur une requête Union.
Tu mets le Order by à la fin du SQL et le tri se fera correctement
sur le mois. Une requête Union portant sur des schémas de relation
identique (meme structure), cela te retournera les tuples dans le bon
ordre. (Si mes souvenirs sont bons)

SELECT r1.Mois, nz(r1.nb,0) as X,nz(r2.nb,0) as Y
FROM r1 LEFT JOIN r2 ON r1.Mois = r2.Mois
UNION SELECT r2.Mois, nz(r1.nb,0),nz(r2.nb,0)
FROM r1 RIGHT JOIN r2 ON r1.Mois = r2.Mois
Order by mois;


A+
Eric


"=?Utf-8?B?S29sb25uYQ==?="
écrivait news::

Merci Eric !!
Ca fonctionne très bien en effet.
Par contre comment gérer le tri maintenant ?
J'ai lu sur ce forum qu'une requête UNION ne pouvait pas
gérer 2 ORDER BY ? J'ai besoin de classer ces mois par ordre
chronologique. Dans mes 2 requêtes principales j'utilise
Format(r1.mois,"#"), mais en UNION, je vois pas trop comment
gérer...

Merci d'avance!!










Avatar
Eric
.../...(Complément)

Si tu fais un traitement sur le champ date alors la clause order by doit
être mise à la fin du 1er SQL comme sur l'exemple ci-dessous :

SELECT month( table2.dte), nz(table2.nb,0) as X,nz(table3.nb,0) as Y
FROM table2 LEFT JOIN table3 ON table2.dte = table3.dte
ORDER BY month( table2.dte) <------ ICI
UNION
SELECT month(table3.dte), nz(table2.nb,0),nz(table3.nb,0)
FROM table2 RIGHT JOIN table3 ON table2.dte = table3.dte
;

A+
Eric

Eric écrivait
news::

re,

Tu ne peux classer que sur les champs du 1er SELECT de ta requête
UNION donc essaies avec ORDER BY r1.mois.

Ta clause Order by tu peux la mettre à la fin du 1er SQL avant Union
ou à la fin. Ca n'a pas d'incidence.

je viens de faire un test sur 2 tables et je n'ai pas le problème que
tu soulèves.

A+
Eric




Avatar
Kolonna
Cela me donne un classement par ordre alphabétique... :-(
Et comme je ne peux classer par date que si un champs est commun aux 2 mois
(r1 et r2), ca m'oblige à créer une nouvelle requête rien que pour le
classement chronologique !

En fait, je me demande si je complique pas tout...
A partir de la table suivante:

N°Auto r1.Date r2.Date
1 01/02/02 01/05/02
2 10/02/02 05/06/03
3 05/06/03 05/07/03
4 06/07/03

je veux obtenir le nombre d'enregistrement par Mois, par champs (r1 et r2),
le tout par ordre chronologique.
En gros:
r1.nb r2.nb
Février 02 2 0
Mai 02 0 1
Juin 03 1 1
Juillet 03 0 2

Je procède actuellement de la manière suivante:
- je fais une requête sur chaque champs afin d'obtenir un COUNT de
Format(r1.date,"mm-yy"). Là je suis obligé de trier sur
Format("01_" & Format(r1.date,"mm-yy"), "#") si je veux un ordre
chronologique...

- ensuite je fais une requête UNION telle que tu me l'a proposée, pour
regrouper les résultats et avoir un tableau unique. Et là, je me retrouve
face au problème du tri par date...

Je débute donc je suis clairement preneur de solutions plus simples !!
Encore merci...








re,

Tu ne peux classer que sur les champs du 1er SELECT de ta requête UNION
donc essaies avec ORDER BY r1.mois.

Ta clause Order by tu peux la mettre à la fin du 1er SQL avant Union ou à
la fin. Ca n'a pas d'incidence.

je viens de faire un test sur 2 tables et je n'ai pas le problème que tu
soulèves.

A+
Eric



"=?Utf-8?B?S29sb25uYQ==?=" écrivait
news::

Eric,

Qu'entends tu par ORDER BY mois ?
J'ai 2 mois, r1.mois et r2.mois.
J'arrive à classer r1 et r2 chronologiquement mais pas les 2
ensembles... Est ce que j'ai raté un truc ?

Merci!



Bonjour Kolonna,

Une seule clause Order By sur une requête Union.
Tu mets le Order by à la fin du SQL et le tri se fera correctement
sur le mois. Une requête Union portant sur des schémas de relation
identique (meme structure), cela te retournera les tuples dans le bon
ordre. (Si mes souvenirs sont bons)

SELECT r1.Mois, nz(r1.nb,0) as X,nz(r2.nb,0) as Y
FROM r1 LEFT JOIN r2 ON r1.Mois = r2.Mois
UNION SELECT r2.Mois, nz(r1.nb,0),nz(r2.nb,0)
FROM r1 RIGHT JOIN r2 ON r1.Mois = r2.Mois
Order by mois;


A+
Eric


"=?Utf-8?B?S29sb25uYQ==?="
écrivait news::

Merci Eric !!
Ca fonctionne très bien en effet.
Par contre comment gérer le tri maintenant ?
J'ai lu sur ce forum qu'une requête UNION ne pouvait pas
gérer 2 ORDER BY ? J'ai besoin de classer ces mois par ordre
chronologique. Dans mes 2 requêtes principales j'utilise
Format(r1.mois,"#"), mais en UNION, je vois pas trop comment
gérer...

Merci d'avance!!














Avatar
Eric
re Kolonna,

En reprennant ton exemple :
table K1 : les données suivantes
DateJ
01/02/2002
10/02/2002
05/06/2003

table K2 : les données suivantes
DateJ
01/05/2002
05/06/2003
05/07/2003
06/07/2003

2 requêtes qui comptent le nb d'enregistrements par table groupés sur le
mois en tenant compte de l'année :
rK1: (SQL)
SELECT DatePart("m",[datej]) AS MoisK, Count(K1.DateJ) AS nb,
Year([datej]) AS Annee, Format([dateJ],"mmmm-yyyy") AS MoisAn
FROM K1
GROUP BY DatePart("m",[datej]), Year([datej]),
Format([dateJ],"mmmm-yyyy")
ORDER BY DatePart("m",[datej]);

RESULTATS:
MoisK nb Annee MoisAn
2 2 2002 février-2002
6 1 2003 juin-2003

rK2 : (SQL)
SELECT DatePart("m",[datej]) AS MoisK, Count(K2.DateJ) AS nb, Year
([datej]) AS Annee, Format([dateJ],"mmmm-yyyy") AS MoisAn
FROM K2
GROUP BY DatePart("m",[datej]), Year([datej]), Format([dateJ],"mmmm-
yyyy")
ORDER BY DatePart("m",[datej]);


RESULTATS:
MoisK nb Annee MoisAn
5 1 2002 mai-2002
6 1 2003 juin-2003
7 2 2003 juillet-2003


et enfin la requête rK3 qui fait la jointure externe totale entre les 2:

SELECT rk1.MoisAn, nz(rK1.nb,0) as X,nz(rK2.nb,0) as Y, rK1.moisK
FROM rK1 LEFT JOIN rK2 ON rK1.MoisAn = rK2.MoisAn
UNION
SELECT rK2.MoisAn, nz(rK1.nb,0),nz(rK2.nb,0), rK2.moisK
FROM rK1 RIGHT JOIN rK2 ON rK1.MoisAn = rK2.MoisAn
ORDER BY rK1.moisK;

retourne les résultats suivants :
MoisAn X Y mois
février-2002 2 0 2
mai-2002 0 1 5
juin-2003 1 1 6
juillet-2003 0 2 7

Le champ mois apparait dans la requête car il sert de critère de tri,
mais tu peux ne pas le mettre dans le formulaire ou l'état.

Ca convient ?

A+
Eric


écrivait


Cela me donne un classement par ordre alphabétique... :-(
Et comme je ne peux classer par date que si un champs est commun aux 2
mois (r1 et r2), ca m'oblige à créer une nouvelle requête rien que
pour le classement chronologique !

En fait, je me demande si je complique pas tout...
A partir de la table suivante:

N°Auto r1.Date r2.Date
1 01/02/02 01/05/02
2 10/02/02 05/06/03
3 05/06/03 05/07/03
4 06/07/03

je veux obtenir le nombre d'enregistrement par Mois, par champs (r1 et
r2), le tout par ordre chronologique.
En gros:
r1.nb r2.nb
Février 02 2 0
Mai 02 0 1
Juin 03 1 1
Juillet 03 0 2

Je procède actuellement de la manière suivante:
- je fais une requête sur chaque champs afin d'obtenir un COUNT de
Format(r1.date,"mm-yy"). Là je suis obligé de trier sur
Format("01_" & Format(r1.date,"mm-yy"), "#") si je veux un ordre
chronologique...

- ensuite je fais une requête UNION telle que tu me l'a proposée,
pour regrouper les résultats et avoir un tableau unique. Et là, je
me retrouve face au problème du tri par date...

Je débute donc je suis clairement preneur de solutions plus simples
!! Encore merci...



Avatar
Kolonna
Salut Eric,

Après test,
la bonne nouvelle, c'est que je procède de la même manière.
La mauvaise, c'est que le tri final de ta dernière requête n'est pas
chronologique...à moins erreur de ma part, mais j'ai fait un copier -
coller...
:-(
Donc je reste toujours sur l'ajout d'une autre requête !!
D'autres idéees ?
;-)

Merci en tout cas.
Kolonna





"Eric" wrote:

re Kolonna,

En reprennant ton exemple :
table K1 : les données suivantes
DateJ
01/02/2002
10/02/2002
05/06/2003

table K2 : les données suivantes
DateJ
01/05/2002
05/06/2003
05/07/2003
06/07/2003

2 requêtes qui comptent le nb d'enregistrements par table groupés sur le
mois en tenant compte de l'année :
rK1: (SQL)
SELECT DatePart("m",[datej]) AS MoisK, Count(K1.DateJ) AS nb,
Year([datej]) AS Annee, Format([dateJ],"mmmm-yyyy") AS MoisAn
FROM K1
GROUP BY DatePart("m",[datej]), Year([datej]),
Format([dateJ],"mmmm-yyyy")
ORDER BY DatePart("m",[datej]);

RESULTATS:
MoisK nb Annee MoisAn
2 2 2002 février-2002
6 1 2003 juin-2003

rK2 : (SQL)
SELECT DatePart("m",[datej]) AS MoisK, Count(K2.DateJ) AS nb, Year
([datej]) AS Annee, Format([dateJ],"mmmm-yyyy") AS MoisAn
FROM K2
GROUP BY DatePart("m",[datej]), Year([datej]), Format([dateJ],"mmmm-
yyyy")
ORDER BY DatePart("m",[datej]);


RESULTATS:
MoisK nb Annee MoisAn
5 1 2002 mai-2002
6 1 2003 juin-2003
7 2 2003 juillet-2003


et enfin la requête rK3 qui fait la jointure externe totale entre les 2:

SELECT rk1.MoisAn, nz(rK1.nb,0) as X,nz(rK2.nb,0) as Y, rK1.moisK
FROM rK1 LEFT JOIN rK2 ON rK1.MoisAn = rK2.MoisAn
UNION
SELECT rK2.MoisAn, nz(rK1.nb,0),nz(rK2.nb,0), rK2.moisK
FROM rK1 RIGHT JOIN rK2 ON rK1.MoisAn = rK2.MoisAn
ORDER BY rK1.moisK;

retourne les résultats suivants :
MoisAn X Y mois
février-2002 2 0 2
mai-2002 0 1 5
juin-2003 1 1 6
juillet-2003 0 2 7

Le champ mois apparait dans la requête car il sert de critère de tri,
mais tu peux ne pas le mettre dans le formulaire ou l'état.

Ca convient ?

A+
Eric


écrivait


Cela me donne un classement par ordre alphabétique... :-(
Et comme je ne peux classer par date que si un champs est commun aux 2
mois (r1 et r2), ca m'oblige à créer une nouvelle requête rien que
pour le classement chronologique !

En fait, je me demande si je complique pas tout...
A partir de la table suivante:

N°Auto r1.Date r2.Date
1 01/02/02 01/05/02
2 10/02/02 05/06/03
3 05/06/03 05/07/03
4 06/07/03

je veux obtenir le nombre d'enregistrement par Mois, par champs (r1 et
r2), le tout par ordre chronologique.
En gros:
r1.nb r2.nb
Février 02 2 0
Mai 02 0 1
Juin 03 1 1
Juillet 03 0 2

Je procède actuellement de la manière suivante:
- je fais une requête sur chaque champs afin d'obtenir un COUNT de
Format(r1.date,"mm-yy"). Là je suis obligé de trier sur
Format("01_" & Format(r1.date,"mm-yy"), "#") si je veux un ordre
chronologique...

- ensuite je fais une requête UNION telle que tu me l'a proposée,
pour regrouper les résultats et avoir un tableau unique. Et là , je
me retrouve face au problème du tri par date...

Je débute donc je suis clairement preneur de solutions plus simples
!! Encore merci...






Avatar
Eric
Bonjour Kolonna,

Je suis surpris car je t'ai donné le copier-coller des tables, des requêtes
(données + SQL) et si tu regardes le jeu d'enregistrements de la requête
UNION avec jointure externe totale (la dernière), il est bien dans l'ordre
chronologique : Février & mai de l'année 2002 puis Juin & Juillet 2003.

As tu bien mis ORDER BY rK1.moisK à la fin de la requête UNION ? Si oui,
alors je ne vois pas pourquoi tu n'obtiens pas les même résultats que moi.

(ACCESS2K)

A+
Eric

"=?Utf-8?B?S29sb25uYQ==?=" écrivait
news::

Salut Eric,

Après test,
la bonne nouvelle, c'est que je procède de la même manière.
La mauvaise, c'est que le tri final de ta dernière requête n'est pas
chronologique...à moins erreur de ma part, mais j'ai fait un copier -
coller...
:-(
Donc je reste toujours sur l'ajout d'une autre requête !!
D'autres idéees ?
;-)

Merci en tout cas.
Kolonna