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

Requête Abonnements impayés pour l'année en cours

3 réponses
Avatar
Dom
Bonjour,

Je suis confronté au problème suivant :
une table Abonnés et une table Abonnements dans une relation de 1 à plusieurs.
Dans la table Abonnements, j'ai un champ Annee et un champ Montant.
Je recherche les abonnés qui n'ont pas payé l'année en cours (2009 en
l'occurrence).
Via une requête simple , j'obtiens actuellement :

Dupont 2007 50
Dupont 2008 60
Dupont 2009 60
Martin 2007 40
Martin 2008 70
Picard 2008 50
Etc.

J'aimerais obtenir :

Dupont 2007 50
Dupont 2008 60
Dupont 2009 60
Martin 2007 40
Martin 2008 70
Martin 2009 0
Picard 2008 50
Picard 2009 0

Le résultat souhaité ainsi présenté semble tout bête, mais...

Merci d'avance si quelqu'un a une solution (sans VBA si possible).

Dom

3 réponses

Avatar
Eric
Bonjour,

En SQL (adapter les noms des champs et à copier dans la fenêtre SQL de
la requête - en mode création de requête Menu Affichage, mode SQL):

SELECT NumAbo,NomAbo,An,Montant
FROM Abonnés INNER JOIN Abonnements ON Abonnés.NumAbo = Abonnements.NumAbo
ORDER BY NomAbo,An
UNION
SELECT NumAbo,NomAbo, year(date()),0
FROM Abonnés WHERE NumAbo not in (SELECT NumAbo FROM Abonnements WHERE
an=year(date()))
;

Je pense qu'il faut ajouter l'identifiant de la table Abonnés dans la
requête car risque de confusion en raison de l'homonymie des noms.

Rem: Si tu ne veux que les abonnés qui n'ont pas payé la cotisation
2009, prends le 2ème SQL (celui qui suit UNION)

Dom a écrit :
Bonjour,

Je suis confronté au problème suivant :
une table Abonnés et une table Abonnements dans une relation de 1 à plusieurs.
Dans la table Abonnements, j'ai un champ Annee et un champ Montant.
Je recherche les abonnés qui n'ont pas payé l'année en cours (2009 en
l'occurrence).
Via une requête simple , j'obtiens actuellement :

Dupont 2007 50
Dupont 2008 60
Dupont 2009 60
Martin 2007 40
Martin 2008 70
Picard 2008 50
Etc.

J'aimerais obtenir :

Dupont 2007 50
Dupont 2008 60
Dupont 2009 60
Martin 2007 40
Martin 2008 70
Martin 2009 0
Picard 2008 50
Picard 2009 0

Le résultat souhaité ainsi présenté semble tout bête, mais...

Merci d'avance si quelqu'un a une solution (sans VBA si possible).

Dom




--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr
Avatar
Eric
re,

Je voulais dire le 2ème SELECT et non SQL

Eric a écrit :
...
Rem: Si tu ne veux que les abonnés qui n'ont pas payé la cotisation
2009, prends le 2ème SQL (celui qui suit UNION)



--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr
Avatar
Dom
Merci Eric pour ta réponse super rapide et précise !
C'est exactement ce qu'il me fallait.
Je n'aurais pas trouvé car j'ai toujours des difficultés avec les requêtes
Union.

Merci encore et bon week-end,

PS : désolé de ne pas poster sous tes réponses, mais elles n'apparaissent
pas dans l'interface CDO et pour l'instant, je n'ai pas le choix de passer
par ailleurs.

Dom


Eric a écrit :

Bonjour,



En SQL (adapter les noms des champs et à copier dans la fenêtre SQL de
la requête - en mode création de requête Menu Affichage, mode SQL):



SELECT NumAbo,NomAbo,An,Montant
FROM Abonnés INNER JOIN Abonnements ON Abonnés.NumAbo >Abonnements.NumAbo
ORDER BY NomAbo,An
UNION
SELECT NumAbo,NomAbo, year(date()),0
FROM Abonnés WHERE NumAbo not in (SELECT NumAbo FROM Abonnements >WHERE
an=year(date()))
;



Je pense qu'il faut ajouter l'identifiant de la table Abonnés dans la
requête car risque de confusion en raison de l'homonymie des noms.



Rem: Si tu ne veux que les abonnés qui n'ont pas payé la cotisation
2009, prends le 2ème SQL (celui qui suit UNION)




"Dom" a écrit :

Bonjour,

Je suis confronté au problème suivant :
une table Abonnés et une table Abonnements dans une relation de 1 à plusieurs.
Dans la table Abonnements, j'ai un champ Annee et un champ Montant.
Je recherche les abonnés qui n'ont pas payé l'année en cours (2009 en
l'occurrence).
Via une requête simple , j'obtiens actuellement :

Dupont 2007 50
Dupont 2008 60
Dupont 2009 60
Martin 2007 40
Martin 2008 70
Picard 2008 50
Etc.

J'aimerais obtenir :

Dupont 2007 50
Dupont 2008 60
Dupont 2009 60
Martin 2007 40
Martin 2008 70
Martin 2009 0
Picard 2008 50
Picard 2009 0

Le résultat souhaité ainsi présenté semble tout bête, mais...

Merci d'avance si quelqu'un a une solution (sans VBA si possible).

Dom