Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
941 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Comment faire cette requête SQL avec des combinaisons

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Comment faire cette requête SQL avec des combinaisons

n°1232877
polo021
Posté le 27-10-2005 à 19:11:44  profilanswer
 

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
mood
Publicité
Posté le 27-10-2005 à 19:11:44  profilanswer
 

n°1232926
polo021
Posté le 27-10-2005 à 20:06:42  profilanswer
 

Est-ce que je suis suffisament clair?

n°1232935
skeye
Posté le 27-10-2005 à 20:11:42  profilanswer
 

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


---------------
Can't buy what I want because it's free -
n°1232936
olivthill
Posté le 27-10-2005 à 20:11:51  profilanswer
 

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 = ...


n°1232950
polo021
Posté le 27-10-2005 à 20:37:05  profilanswer
 

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.

n°1232995
Beegee
Posté le 27-10-2005 à 21:57:15  profilanswer
 

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)

n°1233800
polo021
Posté le 28-10-2005 à 18:47:52  profilanswer
 

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.

n°1233919
Beegee
Posté le 28-10-2005 à 22:53:41  profilanswer
 

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

n°1234434
polo021
Posté le 30-10-2005 à 13:09:04  profilanswer
 

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.

n°1234562
Beegee
Posté le 30-10-2005 à 18:51:51  profilanswer
 

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).

mood
Publicité
Posté le 30-10-2005 à 18:51:51  profilanswer
 

n°1234580
polo021
Posté le 30-10-2005 à 19:26:34  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Comment faire cette requête SQL avec des combinaisons

 

Sujets relatifs
Probléme avec une requete[SQL*PLUS] Probleme avec caractere special & dans requete SQL
Une procédure PL/SQL continue a tourné malgré l'arret de SQL plusPb de requete sql avec mysql
[ASP - Sql Server 2000] Défi pour trouver une requête complexetraitement de requete access avec VB
taille d'une table en SQL[Résolu][SQL] PB de requete (2en 1 ? comme le ...) trop dur pour moi !
Plus de sujets relatifs à : Comment faire cette requête SQL avec des combinaisons


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR