SQL - Comment définir des variables et

phenetas Messages postés 1108 Date d'inscription   Statut Membre Dernière intervention   -  
phenetas Messages postés 1108 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

J'ai une base SQL avec deux tables. L'une est une liste de station d'accueil, l'autre est une liste d'objets associés à ces stations d'accueil.
Les objets associés aux stations d'accueil sont de deux types "A" et "B".

Mon but est de savoir pour chaque station d'accueil, si elle n'a :
- que des objets "A" associés
- OU que des objets "B" associés
- OU des objets "A" ET "B" associés

Exemple :

Table objet
id | nom_station
1 station1
2 station2
3 station3
4 station4


Table objet
 ID_base | nom_objet
1 A
2 A
1 A
2 B
3 B
4 A


Ce que je voudrais c'est un output qui me donnerait :

Station 1 : uniquement des objets "A"
Station 2 : des objets "A" ET "B"
Station 3 : uniquement des objets "B"
Station 4 : uniquement des objets "A"



Je saurais faire l'algorithme et en PHP par exemple, malheureusement je n'ai accès ici qu'au SQL.
Je me rend compte que tout n'est pas possible en SQL, comme par exemple les boucles FOR.

Avez vous svp des pistes pour attaquer ce problème ?

D'avance merci


A voir également:

2 réponses

KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Bonjour,

J'ai pas trop réfléchi mais si j'ai bien compris, tu pourrais faire des COUNT de nom_objet (HAVING nom_objet='A' ou 'B' selon) et ce pour chacun des ID_base ce qui te permettrait de savoir combien d'objets A ou B chaque station possède.
1
phenetas Messages postés 1108 Date d'inscription   Statut Membre Dernière intervention   227
 
Merci KX, je vais orienter mes recherches dans cette voie.

Et pour aller plus loin j'aimerais avoir un résumé du genre :

Il y a X stations avec des objets "A" ET "B"
Il y a Y stations avec des objets "A" uniquement
Il y a N stations avec des objets "B" uniquement


J'imagine que je vais devoir utiliser un COUNT sur les résultats de la requête précédente ?
0
Reivax962 Messages postés 3672 Date d'inscription   Statut Membre Dernière intervention   1 011
 
Bonjour,

Le SQL n'a pas besoin de boucles FOR :)
Tu peux réaliser ce que tu veux en une seule requête bien écrite.
Par exemple, quelque chose comme ça :
SELECT id, nom_station,
    CASE
      WHEN nbA = 0 AND nbB = 0 THEN 'Aucun objet'
      WHEN nbA = 0 AND nbB > 0 THEN 'Que des B'
      WHEN nbA > 0 AND nbB = 0 THEN 'Que des A'
      ELSE 'Des A et des B' END as types_objets
FROM (
   SELECT s.id, s.nom_station,
      SUM(CASE COALESCE(nom_objet, 'Z') WHEN 'A' THEN 1 ELSE 0 END) as nbA,
      SUM(CASE COALESCE(nom_objet, 'Z') WHEN 'B' THEN 1 ELSE 0 END) as nbB
   FROM stations s
   LEFT OUTER JOIN objet o ON o.id_base = s.id
   GROUP BY s.id, s.nom_station
   ) as n


Pour obtenir le texte résumé, tu peux effectivement réutiliser cette requête comme sous-requête, faire un GROUP BY types_objets avec des COUNT :
SELECT types_objets, count(*)
FROM (
   SELECT id, nom_station,
      CASE
         WHEN nbA = 0 AND nbB = 0 THEN 'Aucun objet'
         WHEN nbA = 0 AND nbB > 0 THEN 'Que des B'
         WHEN nbA > 0 AND nbB = 0 THEN 'Que des A'
         ELSE 'Des A et des B' END as types_objets
   FROM (
      SELECT s.id, s.nom_station,
         SUM(CASE COALESCE(nom_objet, 'Z') WHEN 'A' THEN 1 ELSE 0 END) as nbA,
         SUM(CASE COALESCE(nom_objet, 'Z') WHEN 'B' THEN 1 ELSE 0 END) as nbB
      FROM stations s
      LEFT OUTER JOIN objet o ON o.id_base = s.id
      GROUP BY s.id, s.nom_station
      ) as n
   ) as resume
GROUP BY types_objets


Note que cette façon de faire convient tant que tu ne rajoutes pas de nouveaux types d'objets... Cela deviendra plus compliqué si on ne connait pas les types d'objets possibles.

Xavier
1
phenetas Messages postés 1108 Date d'inscription   Statut Membre Dernière intervention   227
 
Merci beaucoup Xavier !
Superbe réponse, j'ai beaucoup apprit en décortiquant cette requête.
0