2010-05-27 6 views
1
SELECT MyTable.Name, 
     (
      SELECT CASE WHEN ISNULL(SUM(TotalDays), 0) <= 0 THEN 0 
         ELSE SUM(TotalDays) 
      END AS Total 
      FROM Application AS Applications 
      WHERE (ID = MyTable.id) 
     ) - MIN(Assignments) AS Excesses 
FROM MyTable 

L'instruction TSQL ci-dessus est une sous-requête dans une requête principale. Lorsque je l'exécute, si TotalDays est NULL ou < = 0, Total est défini sur 0 (zéro).Définir dynamiquement le résultat d'une requête TSQL à l'aide de CASE WHEN

Ce que je voudrais faire ici est de mettre le résultat de toute requête (Dérives) à 0. Je veux (Dérives) qui est le résultat de Total - Min (missions) à régler à 0 si sa valeur est NULL ou < = 0.

Je veux le cas où appliquer à l'ensemble de la requête, mais j'ai du mal à faire les choses correctement.

+1

votre question n'est pas clair (pour moi au moins) peux vous s'il vous plaît donner la structure des tables impliquées et quel est le dat que vous devez obtenir avec vous quesy –

+0

I reformaté en fonction de vos crochets, est-ce exact? – Blorgbeard

+0

Oui le formage édité est très juste – StackTrace

Répondre

1
SELECT 
    MyTable.Name, 
    CASE WHEN 
    0 < (SELECT SUM(TotalDays) FROM Application WHERE ID = MyTable.id) - MIN(Assignments) 
    THEN 
    (SELECT SUM(TotalDays) FROM Application WHERE ID = MyTable.id) - MIN(Assignments) 
    ELSE 
    0 
    END AS [Excesses] 
FROM 
    MyTable 

Remarque: MS SQL Server n'exexute les deux sous-requêtes corrélées indépendamment, il enfait reconnaissent que ce sont les mêmes et réutilisent les résultats.

Alternative:

SELECT 
    MyTable.Name, 
    CASE WHEN 
    0 < SUM([application].TotalDays) - MIN([MyTable].Assignments) 
    THEN 
    SUM([application].TotalDays) - MIN([MyTable].Assignments) 
    ELSE 
    0 -- If either aggregate is NULL, 0 will still be returned 
    END AS [Excesses] 
FROM 
    MyTable 
LEFT JOIN 
    Application 
    ON [application].ID = [MyTable].id 
+0

Merci. J'ai pris la première option et ça a bien fonctionné. – StackTrace

0
SELECT MyTable.Name, CASE WHEN ISNULL(SUM(TotalDays), 0) <= 0 THEN 0 ELSE SUM(TotalDays) END AS Total 
FROM Application AS Applications 
JOIN MyTable 
ON  Applications.id = mytable.id 
GROUP BY 
     MyTable.id, MyTable.name 
HAVING CASE WHEN ISNULL(SUM(TotalDays), 0) <= 0 THEN 0 ELSE SUM(TotalDays) END > 0 
Questions connexes