Requête multi jointures et regroupement

Requête multi jointures et regroupement - SQL/NoSQL - Programmation

Marsh Posté le 20-10-2009 à 16:17:59    

Bonjour à tous,
 
J'ai un problème avec une requête que je n'arrive pas à concevoir sur les tables ci-dessous :
 

Code :
  1. adherents
  2. -----------
  3. id
  4. id_chef
  5. chef [0,1]
  6. libelle

Un adhérent peut être un chef (chef [1]) ou peut être un sous-chef  (chef [0]) rattaché à un chef (id_chef)
 

Code :
  1. cotisations
  2. -----------
  3. id
  4. id_adherent
  5. annee
  6. montant


Je voudrais sortir la liste des adhérents de type "chef" dont :
- au moins un sous-chef ou le chef ont versé une cotisation en 2006
- au moins un sous-chef ou le chef ont versé une cotisation en 2008
- aucun des sous-chefs ni le chef n'ont versé de cotisation en 2007
 
En fait j'avais une requête qui fonctionnait très bien justement pour sortir la liste des adhérents sans prendre en compte les chefs et sous-chefs :
 

Code :
  1. SELECT a.id,a.libelle FROM adherent a
  2. RIGHT JOIN cotisations c1 ON c1.id_adherent = a.id
  3. RIGHT JOIN cotisations c2 ON c2.id_adherent = a.id
  4. WHERE c1.annee = '2008' AND c1.montant > 0
  5. AND c2.annee = '2006' AND c2.montant > 0
  6. AND a.id NOT IN (SELECT id_adherent FROM cotisations WHERE annee = '2007')
  7. GROUP BY a.id
  8. ORDER BY a.libelle ASC


 
J'aimerais en fait faire la même requête mais en ne sortant que les id des chefs mais en prenant en compte les cotisations du chef et de leurs sous-chefs.
Il faudrait pouvoir considérer un groupe d'adhérents (1 chef + n sous-chefs) comme un unique adhérent.
 
C'est peut être pas très clair ... ?
 
En tout cas je bloque complètement, merci d'avance ;)

Reply

Marsh Posté le 20-10-2009 à 16:17:59   

Reply

Marsh Posté le 20-10-2009 à 16:22:07    

tu peux donner un exemple de contenu des tables / résultat attendu?
J'ai un peu de mal à visualiser, là :D


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 20-10-2009 à 17:58:20    

ADHERENTS
 

Code :
  1. id  id_chef  chef   libelle
  2. --------------------------------
  3. 1   3         0      adherent1
  4. 2   3         0      adherent2
  5. 3   0         1      chef1
  6. 4   5         0      adherent3
  7. 5   0         1      chef2


 
 
COTISATIONS
 

Code :
  1. id  id_adherent   annee   montant
  2. -------------------------------------------
  3. 1   1             2008      15
  4. 2   1             2006      12
  5. 3   3             2005      18
  6. 4   4             2007      23


 
Résultat attendu :
 

Code :
  1. id libelle
  2. ------------
  3. 3 chef1


 
Car le chef1 et ses sous-chefs (adherent1 et adherent2) ont versés au moins une fois en 2006 et 2008 et n'ont pas versé en 2007.


Message édité par drmedia le 20-10-2009 à 17:59:37
Reply

Marsh Posté le 21-10-2009 à 09:47:27    

la colonne "chef" ne sert à rien car en autorisant NULL comme id_chef, ça indique si c'est un chef. Après, le niveau dans l'arbo des chefs détermine si c'est un chef, un sous-chef ou un simple sous-fifre :)


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 21-10-2009 à 11:32:42    

En fait il n'y a que deux niveaux dans l'arbo : soit "chef" soit "pas chef"  
Un "pas chef" peut avoir un chef au dessus de lui ou pas.
Tu as raison sur la colonne "chef" mais j'avais pensé que dans la construction de ma requête cela pouvait simplifier.
 
 
 
Dans mes réflexions j'en suis à cette requête :
 

Code :
  1. SELECT a.id_chef,chef.libelle FROM adherent a
  2. LEFT JOIN adherent chef ON chef.id = a.id_chef
  3. RIGHT JOIN cotisations c1 ON c1.id_adherent = a.id
  4. RIGHT JOIN cotisations c2 ON c2.id_adherent = a.id
  5. WHERE chef.chef = 1
  6. AND c1.annee = '2008' AND c1.montant > 0
  7. AND c2.annee = '2006' AND c2.montant > 0
  8. AND a.id NOT IN (SELECT id_adherent FROM cotisations WHERE annee = '2007')
  9. GROUP BY a.id_chef
  10. ORDER BY chef.libelle ASC


 
Mais dans ce cas il faut que chaque chef id_chef=id...


Message édité par drmedia le 21-10-2009 à 11:34:41
Reply

Sujets relatifs:

Leave a Replay

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