2010-05-27 45 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 

上述TSQL語句是主查詢中的子查詢。當我運行它時,如果TotalDays爲NULL或< = 0,則Total設置爲0(零)。使用CASE WHERE動態設置TSQL查詢的結果

我想在這裏做什麼是對整個查詢(超支)的結果設置爲0。我想(超支)這是總的結果 - 最小(分配)設置爲0如果它的NULL或< = 0。

我想要CASE當適用於整個查詢,但我正在努力做到正確。

+1

你的問題不明確(至少對我來說) 可以請您給所涉及的表的結構,什麼是你需要得到你quesy – 2010-05-27 13:03:36

+0

我重新格式化DAT根據你的括號,這是正確的嗎? – Blorgbeard 2010-05-27 13:07:02

+0

是的編輯的格式非常正確 – StackTrace 2010-05-27 13:13:54

回答

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 

注:MS SQL Server將不exexute兩個相關子查詢independantly,它將INFACT認識到,它們是相同的和重複使用的結果。

備選:

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

謝謝。我採取了第一個選擇,它的確做到了正確的工作。 – StackTrace 2010-05-27 14:17:14

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