2017-08-30 43 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。如果您有任何问题,请告诉我。 –