2010-03-23 2 views
1

J'essaie d'ajouter une instruction CASE à la fin de ma requête SQL pour calculer une valeur en fonction d'une autre valeur de table et d'une valeur précédemment calculée dans SELECT. L'erreur est renvoyée que DelivCount est un nom de colonne non valide. Y a-t-il une meilleure façon de faire ou est-ce que je fais quelque chose de mal?Comment faire référence à une valeur précédemment calculée dans l'instruction SQL Query

SELECT jd.FullJobNumber, jd.ProjectTitle, jd.ClientName, jd.JobManager, jd.ProjectDirector, jd.ServiceGroup, jd.Status, jd.HasDeliverables, jd.SchedOutsideJFlo, jd.ReqCompleteDate,(SELECT COUNT(*)FROM DeliverablesSchedule ds WHERE jd.FullJobNumber = ds.FullJobNumber) as DelivCount, SchedType = 
    CASE 
     WHEN (jd.SchedOutsideJFlo = 'Yes') 
      THEN 'outside' 
     WHEN (jd.HasDeliverables = 'No ') 
      THEN 'none' 
     WHEN (DelivCount > 0) 
      THEN 'has' 
     WHEN (jd.HasDeliverables = 'Yes' AND DelivCount = 0) 
      THEN 'missing' 
     ELSE 'unknown' 
    END 
FROM JobDetail jd 
+1

Vous devez spécifier le SGBD que vous utilisez pour ce type de question car la réponse variera en fonction du produit. –

Répondre

1

essayer ce qui devrait courir beaucoup plus vite:

SELECT 
    jd.FullJobNumber, jd.ProjectTitle, jd.ClientName, jd.JobManager, jd.ProjectDirector, jd.ServiceGroup, jd.Status, jd.HasDeliverables, jd.SchedOutsideJFlo, jd.ReqCompleteDate 
     ,ds.DelivCount 
     ,SchedType =CASE 
         WHEN (jd.SchedOutsideJFlo = 'Yes') 
          THEN 'outside' 
         WHEN (jd.HasDeliverables = 'No ') 
          THEN 'none' 
         WHEN (ds.DelivCount > 0) 
          THEN 'has' 
         WHEN (jd.HasDeliverables = 'Yes' AND ds.DelivCount = 0) 
          THEN 'missing' 
         ELSE 'unknown' 
        END 
    FROM JobDetail jd 
     LEFT OUTER JOIN (SELECT 
          FullJobNumber, COUNT(*) AS DelivCount 
          FROM DeliverablesSchedule 
          GROUP BY FullJobNumber 
         ) ds ON jd.FullJobNumber = ds.FullJobNumber 

La requête originale utilise un sous-requête:

Un sous-requête est un SELECT requête que renvoie une valeur unique et est imbriqué dans une instruction DELETE SELECT, INSERT, UPDATE ou ou dans une autre sous-requête . Une sous-requête peut être utilisée n'importe où une expression est autorisée.

De par la nature même d'une sous-requête, elle doit être exécutée plusieurs fois, une fois pour chaque ligne. J'ai réécrit la requête pour utiliser une table dérivée, qui est évaluée une fois pour trouver tous les comptes et est ensuite jointe aux lignes appropriées. Cela permet de faire référence à la valeur DelivCount comme toute colonne serait jointe à partir d'une autre table, et devrait accélérer cette requête.

2

essayer cette

SELECT 
Z.*, 
SchedType = 
    CASE 
     WHEN (Z.SchedOutsideJFlo = 'Yes') 
      THEN 'outside' 
     WHEN (Z.HasDeliverables = 'No ') 
      THEN 'none' 
     WHEN (Z.DelivCount > 0) 
      THEN 'has' 
     WHEN (Z.HasDeliverables = 'Yes' AND Z.DelivCount = 0) 
      THEN 'missing' 
     ELSE 'unknown' 
    END 
FROM 
(
     SELECT 
     jd.FullJobNumber, 
     jd.ProjectTitle, 
     jd.ClientName, 
     jd.JobManager, 
     jd.ProjectDirector, 
     jd.ServiceGroup, 
     jd.Status, 
     jd.HasDeliverables, 
     jd.SchedOutsideJFlo, 
     jd.ReqCompleteDate, 
     (SELECT COUNT(*)FROM DeliverablesSchedule ds WHERE jd.FullJobNumber = ds.FullJobNumber) as DelivCount 
     FROM JobDetail jd 
) 
Z 
Questions connexes