SQL - Comment définir des variables et

Fermé
phenetas Messages postés 1096 Date d'inscription mercredi 25 juillet 2007 Statut Membre Dernière intervention 31 août 2017 - 22 févr. 2017 à 19:55
phenetas Messages postés 1096 Date d'inscription mercredi 25 juillet 2007 Statut Membre Dernière intervention 31 août 2017 - 24 févr. 2017 à 15:48
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


2 réponses

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
22 févr. 2017 à 20:15
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 1096 Date d'inscription mercredi 25 juillet 2007 Statut Membre Dernière intervention 31 août 2017 224
23 févr. 2017 à 09:54
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 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
23 févr. 2017 à 10:36
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 1096 Date d'inscription mercredi 25 juillet 2007 Statut Membre Dernière intervention 31 août 2017 224
24 févr. 2017 à 15:48
Merci beaucoup Xavier !
Superbe réponse, j'ai beaucoup apprit en décortiquant cette requête.
0