Comment faire cette requête SQL avec des combinaisons

Comment faire cette requête SQL avec des combinaisons - SQL/NoSQL - Programmation

Marsh Posté le 27-10-2005 à 19:11:44    

Hello,
 
Voici ma table  


Numéro | Famille
----------------
     1    |    A
     1    |    B
     2    |    A
     3    |    B
     3    |    A
     4    |    B
     4    |    A
     4    |    C
     5    |    B
     5    |    A
     6    |    A
     6    |    B
     7    |    A
     7    |    C
 


J'ai 3 valeurs possibles pour ma colonne Famille, ce sont A, B et C
Avec ces 3 valeurs je déduis les combinaisons suivantes {A, B, C, AB, AC, BC, ABC}
 
J'aimerai donc votre aide pour faire une requête qui me dirait :
Pour la combinaison A nous avons 1 Numéro (2)
Pour la combinaison B nous avons 0 Numéro
Pour la combinaison C nous avons 0 Numéro
Pour la combinaison AB nous avons 4 Numéro (1, 3, 5 ,6)
Pour la combinaison AC nous avons 1 Numéro (7)
Pour la combinaison BC nous avons 0 Numéro
Pour la combinaison ABC nous avons 1 Numéro (6)
 
Comment faire?  :sweat:  
 
Je suis sous Access j'avais pensé à créer 1 table avec les numéros qui ont 1 lignes dans la table, une table avec les numéros qui ont 2 lignes, et une table avec les numéros qui ont 3 lignes. J'ai réussi à faire une requète par combinaison possible avec les valeurs du champs Famille en dur et ca fonctionne mais étant donné qu'en fait j'ai 5 familles ca fait bcp de requêtes et les valeurs sont en dur, ca ne me plait pas.
 
J'ai pensé aussi à faire une requête qui me retourne les combinaisons possible pour faciliter la vie. mais ca ne marche pas teriblement.
 
Que conseillez-vous?
 
MErci


Message édité par polo021 le 27-10-2005 à 19:26:29
Reply

Marsh Posté le 27-10-2005 à 19:11:44   

Reply

Marsh Posté le 27-10-2005 à 20:06:42    

Est-ce que je suis suffisament clair?

Reply

Marsh Posté le 27-10-2005 à 20:11:42    

Je comprends même pas ton exemple...[:petrus75]


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

Marsh Posté le 27-10-2005 à 20:11:51    

On fait souvent beaucoup plus de sélections que d'insertion, et donc on prèfera avoir la combinaison (routine d'insertion complexe et routine de sélection simple) plutôt que d'avoir la combinaison (routine d'insertion simple et routine de sélection complexe).
 
Donc je remplacerais la table des famille (ou j'aurais en plus de celle-ci, si elle est utilisée par ailleurs) une table des combinaisons :
 
Combinaison | Quantite
----------------------------
A   | 1
B   | 0
C   | 0
AB  | 4
AC  | 1
BC  | 0
ABC | 1
 
Et la requête de sélection deviendrait

SELECT Quantite
  FROM Table_combinaison
 WHERE Combinaison = ...


Reply

Marsh Posté le 27-10-2005 à 20:37:05    

oui merci mais le fait est que je dispose de cette table et de rien d'autre pour travailler [:sinclaire]
 
skeye :  
pour chaque ligne dans la table je dois regarder si elle (et les autres qui  portent le même numéro qu'elle) appartient à une des combinaisons.  
Et à chaque fois que j'en trouve une, j'ajoute 1 au compteur de cette combinaison. Mais évidemment je ne dois plus prendre en compte les lignes qui portent un numéro que j'ai déjà compté avant.

Reply

Marsh Posté le 27-10-2005 à 21:57:15    

Si tu peux construire la table des combinaisons possibles :
 
combinaison, famille
'A', 'A'
'B', 'B'
'C', 'C'
'AB', 'A'
'AB', 'B'
'AC', 'A'
'AC', 'C'
'BC', 'B'
'BC', 'C'
'ABC', 'A'
'ABC', 'B'
'ABC', 'C'
 
(ça doit être faisable par script ... ceci dit, si tu restes à 5 lettres tu peux le faire en dur une fois pour toutes dans une table)
 
Ensuite, une requête comme ça pour avoir le résultat :
 
SELECT combinaison, COUNT(*) FROM (
SELECT cp.combinaison, nf.numero, COUNT(*)
FROM numeroFamille nf, combinaisonsPossibles cp
WHERE nf.famille = cp.famille
GROUP BY mcp.combinaison, nf.numero
HAVING COUNT(*) = LENGTH(cp.combinaison))
GROUP BY combinaison;
 
(à adapter car je sais pas si LENGTH renvoie la longueur d'une chaîne, j'utilise pas Access)

Reply

Marsh Posté le 28-10-2005 à 18:47:52    

Ca marche!  :)
Un grand merci
 
Pour le LENGTH je ne peux pas te répondre car j'ai splitté ma table en 5 tables plus petites contenant chacune les numéros qui ont soit 1 ou 2 ou 3 ... lettres donc j'ai remplacé length par le nombre de lettre de ma combinaison en dur dans la requête et j'ai fait 5 requêtes. Ce qui me permet aussi de gagner un peu en performance je pense.
 
Mais pourquoi ais-je besoin de HAVING COUNT(*) = LENGTH(cp.combinaison) dès lors que j'ai 5 tables au lieu d'une (comme avant)? En effet si je ne le mets pas je n'obtiens pas le bon résultat.

Reply

Marsh Posté le 28-10-2005 à 22:53:41    

Sinon tu compterais les numéros qui ont 'AC' pour la combinaison 'ABC' par exemple.

Reply

Marsh Posté le 30-10-2005 à 13:09:04    

J'ai fait 5 tables. Une pour les numéros qui ont 1 lettre
une pour les numéros qui ont 2 lettres, une pour les numéros qui ont 3 lettres, une pour les numéros qui ont 4 lettres, une pour les numéros qui ont 5 lettres. Et je fais une requête par table donc je ne devrais pas devoir préciser le nombre de lettres dans la requête il me semble.

Reply

Marsh Posté le 30-10-2005 à 18:51:51    

Prenons un exemple : la combinaison ABC.
 
Si dans ta table principale, un numéro est associé à A et B, mais pas à C, alors il ne faut pas le compter pour la combinaison ABC ... pourtant c'est ce que fera la requête si tu enlève la condition 'COUNT(*) = LENGTH(combinaison)' ( = 3 ici).

Reply

Marsh Posté le 30-10-2005 à 18:51:51   

Reply

Marsh Posté le 30-10-2005 à 19:26:34    

Oui j'ai compris maintenant, c'est logique, merci

Reply

Sujets relatifs:

Leave a Replay

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