Plusieurs counts SQL dans plusieurs critères

J'ai essayé d'optimiser la manière dont je récupère datatables de ma database pour les afficher sur une page de type "tableau de bord" pour le développement de logiciels

Ma structure de database est la suivante:

  • Table des exigences qui contient toutes les exigences différentes avec divers champs, mais surtout un REQ_ID comme key.
  • Tâches La table qui contient peut contenir plusieurs tâches avec TASK_ID, TASK_NAME (DEV, TEST OU RELEASE), TASK_STATUS (Non démarré, Terminé, Bloqué), TASK_WINDOW (Semaine1, Semaine2, .. etc. lorsque la tâche est terminée) et un lien return à une exigence avec REQ_I. Par exemple, une exigence peut avoir plusieurs tâches de dev, de test et de relâchement mais ne peut être complète que si toutes les tâches de dev liées à une exigence sont complètes, sinon elle est incomplète

Je voudrais interroger ces deux tables pour me fournir un set de résultats qui contient individuellement les exigences DEV Complete, Test Complete et Release Complete par window de tâche DEV dans une seule requête. Je suis en train d'effectuer plusieurs requêtes contenant chacune des sous-requêtes, puis agréger les résultats avec PHP, mais cela prend au total 15 sec à exec, Quelqu'un peut-il m'aider s'il vous plaît dans la consolidation d'une seule requête>

SELECT r.REQ_ID, SUM(CASE WHEN t.TASK_NAME = 'DEV' THEN 1 ELSE 0 END) AS DevComplete, SUM(CASE WHEN t.TASK_NAME = 'TEST' THEN 1 ELSE 0 END) AS TestComplete, SUM(CASE WHEN t.TASK_NAME = 'RELEASE' THEN 1 ELSE 0 END) AS ReleaseComplete FROM Requirements r INNER JOIN Tasks t ON r.REQ_ID = t.REQ_ID WHERE t.TASK_STATUS = 'Complete' GROUP BY r.REQ_ID 

Je réalise que c'est une vieille question mais j'ai fait un test avec les templates suivants:

Modèle 1:

 SELECT [Count1] = SUM(CASE WHEN ... THEN 1 ELSE 0 END), [Count2] = SUM(CASE WHEN ... THEN 1 ELSE 0 END) FROM [Table] GROUP BY [Field] 

Motif 2:

 SELECT [COUNT1] = (SELECT COUNT(*) FROM [Table] WHERE ...), [Count2] = (SELECT COUNT(*) FROM [Table] WHERE ...) 

Dans mon cas, lors de l'exécution des deux requêtes, le motif 2 prenait 36% du time et le motif 1 prenait 64%. Pour moi, le motif 1 semble plus élégant, mais il n'a pas été aussi performant dans mon scénario.