0
votes

Montrer "0" résultats avec le compte (cours.ID)

J'ai une requête qui compte correctement le nombre d'étudiants dans chaque cours de la plate-forme, mais cela ne renvoie pas les résultats dans lesquels l'étudiant compte = 0. Comment puis-je modifier la requête ci-dessous pour inclure ceci?

< fort> SQL: xxx

résultat réel: xxx

Résultat prévu: xxx

J'ai cherché quelques questions à ce sujet déjà (par exemple, ici ), mais ne peut pas traduire la réponse à ma situation.


6 commentaires

Une de votre table n'a pas de données correspondant, essayez d'utiliser la jointure gauche sur Prefix_Role_Assignments.


ProTip: Ne générez pas de données au niveau de la vue dans SQL. Dans ce cas, vous générez HTML dans votre SQL. Ne faites pas cela car il rendra votre code beaucoup moins maintenu à long terme - et si vous souhaitez exécuter votre requête à partir d'une application non Web? Point est: suivez le principe de responsabilité unique.


@metal qui ne fonctionnera pas parce que vous vous retrouveriez avec un compte s'il y a un enregistrement dans Prefix_Course. Mais il demande des cas où le compte est 0. Je ne suis pas sûr que la question est assez bien formée. OP - Pourquoi y aurait-il un enregistrement dans Prefix_Course si vous attendez que le compte d'identification soit 0 (aka non existant)?


@kjmerf, ahh je vois ce que tu veux dire. Je serais peut-être à repenser comment j'ai créé cette requête alors. Il a initialement commencé comme une requête avec le nombre d'étudiants (c'est-à-dire que la catégorie, le cours et les informations sur le thème), qui est une requête beaucoup plus simple dans la base de données. Avez-vous des recommandations sur la façon de faire cela? Je vais ajouter un lien SQLfiddle pour inclure le schéma de base de données et des données factices.


Avec les résultats attendus et les données d'échantillonnage, il devrait être faisable.


@dai, je n'exécute pas cette requête au niveau de la base de données. Je l'exécute au niveau de l'application dans la plate-forme Moodle via le plug-in de rapports configurables - permet à Moodle Admin de créer et d'exécuter des instructions de sélection par rapport à la base de données avec l'utilisateur ayant besoin d'un accès à la base de données elle-même. moodle.org/plugins/block_configurable_reports


3 Réponses :


0
votes

Si vous déplacez la table de prefix_course sur une jointure extérieure gauche et utilisez SUM (si (Course.Id est NULL, 0,1)) au lieu de la somme, cela devrait fonctionner:

select
    concat('<a target="_blank" href="%%wwwroot%%/course/index.php?categoryid=',cat.id,'">', cat.name,'</a>') as "Category",
    concat('<a target="_new" href="%%wwwroot%%/course/view.php?id=',course.id,'">',course.fullname,'</a>') as "Course",
    course.theme as "Theme",
    sum(iif(course.id is null,0,1)) as "Students"
from prefix_context as context 
    inner join prefix_role_assignments as ra on ra.contextid = context.id
    inner join prefix_course_categories as cat on cat.id = course.category
    left outer join prefix_course as course on context.instanceid = course.id and course.theme like 'tdc%'
where context.contextlevel = 50 and ra.roleid = 5
group by cat.id, cat.name, course.id, course.fullname, course.theme
order by cat.name


5 commentaires

Malheureusement, cela ne corrige pas le problème - il affiche le même jeu de données que le compte (cours.ID).


Il montrera également les enregistrements qui ont un nombre de 0, en raison de l'utilisation de la jointure extérieure gauche. Et dans SQL Server, le conditionnel n'est pas si (ou si vous pouvez utiliser un cas).


Ah, mon mauvais. Je pensais juste que iif était une faute de frappe! Je devais déplacer la deuxième jointure interne à la fin de la fin de partir pour résoudre "le cours d'identifiant multi-pièces". Catégorie "ne pouvait pas être lié.", Mais cela produit toujours exactement le même jeu de données que mon "résultat réel".


Oui, tu as raison. Dans le cadre de la clause où il y avait un "et un cours" comme "TDC%" ". Cela faisait fondamentalement la rejoignée de l'extérieur gauche se comporter comme une jointure intérieure. Je l'ai changé et déplacez-le dans le cadre des conditions de jointure interne.


Hey @ cte6, j'ai posté un commentaire avec le code qui résout ce problème. Votre solution de somme a beaucoup aidé à y arriver!



0
votes

En regroupant de cette façon: groupe par tous code>. C'est une alternative à la réponse de CTE6.

Query ajusté: P>

select
    concat('<a target="_blank" href="%%wwwroot%%/course/index.php?categoryid=',cat.id,'">', cat.name,'</a>') as "Category",
    concat('<a target="_new" href="%%wwwroot%%/course/view.php?id=',course.id,'">',course.fullname,'</a>') as "Course",
    course.theme as "Theme",
    count(course.id) as "Students"
from prefix_course as course
    join prefix_context as context on context.instanceid = course.id
    join prefix_role_assignments as ra on ra.contextid = context.id
    join prefix_course_categories as cat on cat.id = course.category
where context.contextlevel = 50 and ra.roleid = 5 and course.theme like 'tdc%'
group by all cat.id, cat.name, course.id, course.fullname, course.theme
order by cat.name


1 commentaires

Agréable! C'est des progrès, mais il montre maintenant beaucoup de données qui ne devraient pas être ici - il montre environ 1000 enregistrements et non le résultat souhaité que j'ai ajouté à l'OP.



0
votes

Après un certain temps, j'ai réalisé que mon problème était avec la sélection de tables que je pensais être tenues d'exécuter cette tâche. J'ai résolu cette question avec l'instruction et les tables suivantes. J'ai également utilisé différentes données factices (désolé), j'ai donc mis à jour mon op avec les nouvelles données factices: xxx

tables: préfixe_course_categories: xxx

préfixe_course: xxx

préfixe_user: xxx

préfixe_role: xxx

préfixe_role_asignments: xxx

préfixe_context: xxx < / p>


0 commentaires