Bonjour à tous,
j'ai un problème SQL sur un tri de réponses à un questionnaire pour lequel j'ai beaucoup de mal à trouver une solution.
Ces questionnaires sont tous les mêmes, mais dépendent d'un sujet (par exemple : Vos avis sur l'objet A, Vos avis sur l'objet B).
J'ai une table A ("Libelle") qui contient l'ensemble des réponses possibles (les réponses sont prédéfinies).
J'ai une table B ("Id", "Valeur", "Groupe") qui contient l'ensemble des réponses données possibles, où le groupe est le sujet du questionnaire correspondant à cette réponse.
Mon but est d'avoir une vue C ("Libelle", "Groupe", "Quantité") où Quantité est le nombre de réponses pour un libellé et un groupe telle que l'on ait par exemple :
("Très satisfaisant","ObjetA",5)
("Très mécontent","ObjetB",0)
La requête est très simple si l'on ne souhaite pas avoir les réponses qui n'apparaissent pas (Où quantité = 0). Or, j'ai quelques problèmes lorsque je veux le nombre de réponses pour toutes les possibilités.
J'ai tout d'abord réussi quelque chose avec des unions (Ensemble des réponses telles que (Quantité != 0) UNION Ensemble des réponses possibles avec (Quantité = 0) MINUS/EXCEPT Ensemble des réponses existantes).
Mais bien entendu c'était très lent.
La solution que j'ai actuellement est :
On fait A x (SELECT distinct Groupe from B) pour avoir un produit cartésien et on a dont l'ensemble des réponses possibles, puis on fait un LEFT JOIN avec B et on compte sur B.Groupe (puisque si B.Groupe est NULL, le couple (Réponse, Sujet) n'a jamais été donné).
Ca marche très bien, mais c'est toujours trop lent et je suis à court d'idées... Quelqu'un connaitrait il un meilleur moyen ? (SGBD : Postgresql)
Voici la requête en question :
Requêtes de création de table :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 select a.label, G.groupe, count(b.groupe) as qte from a cross join (select distinct groupe from b) as G left join b on a.libelle = b.valeur and b.groupe = G.groupe group by G.groupe, a.libelle;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 create table a ("Libelle" VARCHAR);
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 create table b ("Id" INT, "Valeur" VARCHAR, "Groupe" INT);
Partager