2017-08-30 40 views
3

我正在爲我工​​作的小型非營利組織創建一些存儲過程。我們有一個表格,其中包含我們年度預算的信息,包括每個訂單項的預算金額(即「促銷材料,500」)。還有另外一張桌子,其中記錄了我們的所有費用,以及他們來自哪個預算項目。我想運行一個存儲過程,將該預算行中的所有費用與另一個表中的起始預算金額相減。我想出了測試過程中的查詢是這樣的:使用SQL查詢來運行當前餘額

SELECT b.budget_line_ID, 
     b.budget_line_name, 
     b.[2017_amount] - e.amount AS CurrentBalance 
FROM budget_detail AS b 
INNER JOIN expenses AS e ON b.budget_line_ID = e.budget_line_id 
WHERE e.budget_line_id = 4; 

然而,當我運行查詢,右列的出現但不包含信息。

任何幫助將不勝感激!

+2

有兩個表中一個budget_line_id = 4?另外,這聽起來像你可能想要做b [2017_amount] - 總和(e.amount),而不是...順便說一句,謝謝你與非營利組織合作 – scsimon

+0

你有兩個表中的budget_line_id = 4嗎? 'INNER JOIN'要求它出現在兩個表上,否則它不會返回任何東西。 – Nathan

+0

在桌子'b'你有'budget_line_ID'但在'e'它''budget_line_id'這是正確的嗎? –

回答

0

也許是這樣的?

DECLARE @budget_line_id INT = 4; 

SELECT 
    b.budget_line_id, 
    b.budget_line_name, 
    CurrentBalance = b.[2017_amount] - te.amount 
FROM 
    dbo.budget_detail b 
    CROSS APPLY (
     SELECT 
      amount = SUM(e.amount) 
     FROM 
      dbo.expenses e 
     WHERE 
      b.budget_line_ID = e.budget_line_id 
      AND e.budget_line_id = @budget_line_id 
     ) te 
WHERE 
    b.budget_line_id = @budget_line_id; 

編輯:提供做同樣的事情的2的替代方法。

-- JOIN to a derived table... 
SELECT 
    b.budget_line_id, 
    b.budget_line_name, 
    CurrentBalance = b.[2017_amount] - te.amount 
FROM 
    dbo.budget_detail b 
    JOIN (
     SELECT 
      e.budget_line_id, 
      amount = SUM(e.amount) 
     FROM 
      dbo.expenses e 
     WHERE 
      e.budget_line_id = @budget_line_id 
     GROUP BY 
      e.budget_line_id 
     ) te 
     ON b.budget_line_id = te.budget_line_id 
WHERE 
    b.budget_line_id = @budget_line_id; 

...

-- Correlated sub-query in the SELECT... 
SELECT 
    b.budget_line_id, 
    b.budget_line_name, 
    CurrentBalance = b.[2017_amount] 
     - (SELECT 
      amount = SUM(e.amount) 
     FROM 
      dbo.expenses e 
     WHERE 
      b.budget_line_ID = e.budget_line_id 
      AND e.budget_line_id = @budget_line_id 
     ) 
FROM 
    dbo.budget_detail b 
WHERE 
    b.budget_line_id = @budget_line_id; 
+1

它工作!非常感謝!現在,弄清楚你是如何工作的,以便我可以真正學到東西;) – jembrey

+0

CROSS APPLY只允許在from子句中使用相關的子查詢。在這種情況下,我們爲外部查詢中的每個budget_line_id創建一個e.amount的SUM。在這裏,這不是絕對必要的,因爲有其他的方式來寫這個並得到相同的結果。我將更新我的原始答案,以演示SELECT中派生表和相關子查詢的更傳統的JOIN。如果您有任何問題,請告訴我。 –