查询根据两个条件连接表

时间:2014-05-15 01:04:23

标签: sql sql-server-2008

首先,我不确定标题是否恰当地描述了我想要实现的目标 - 所以请按照您的意愿进行修改。

我在SQL数据库中有一个记录预算分配和转移的表。

每个分配和传输都是根据两个细节的组合记录的 - year_ID和program_ID。分配可以来自任何地方,也可以来自其他year_id& program_id组合 - 这些是转移。

例如,year_ID 1& program_ID 2分配了1000美元,然后是year_ID 1& program_ID 2将$ 100转移到year_ID 2& program_id 2.

这存储在数据库中,如

From_year_ID  From_program_ID  To_year_ID   To_program_ID    Budget
null          null             1            2                1000
1             2                2            2                100    

查询需要根据year_id + program_id组合汇总这些预算分配,因此结果会显示:

year_ID   program_ID    Budget_Allocations    Budget_Transfers
1         2             1000                  100
2         2             100                   0

我花了两天时间试图将这个问题放在一起并且正式陷入困境 - 有人可以帮助我或指出我正确的方向吗?我尝试了左,右,内,联合等各种组合的感觉 - 但是没有得到我正在寻找的结果。

这是一个包含示例数据的sqlfiddle:http://sqlfiddle.com/#!3/9c1ec/1/0以及其中一个不起作用的查询。

1 个答案:

答案 0 :(得分:1)

我会在一些CTE中按照Program_ID和Year_ID对预算进行汇总,并将这些预算与计划和年份表相加,以避免多次汇总预算值。

WITH
  bt AS
    (SELECT
       To_Year_ID AS Year_ID,
       To_Program_ID AS Program_ID,
       SUM(Budget) AS Budget_Allocation
     FROM T_Budget
     GROUP BY
       To_Year_ID,
       To_Program_ID),
  bf AS
    (SELECT
       From_Year_ID AS Year_ID,
       From_Program_ID AS Program_ID,
       SUM(Budget) AS Budget_Transfer
     FROM T_Budget
     GROUP BY
       From_Year_ID,
       From_Program_ID)

SELECT
  y.Year_ID,
  p.Program_id,
  bt.Budget_Allocation,
  bf.Budget_Transfer,
  y.Short_Name + ' ' + p.Short_Name AS Year_Program,
  isnull(bt.Budget_Allocation,0) -
     isnull(bf.Budget_Transfer,0)AS Budget_Balance
FROM T_Programs p
  CROSS JOIN T_Years y
  INNER JOIN bt
    ON bt.Program_ID = p.Program_ID 
    AND bt.Year_ID = y.Year_ID
  LEFT JOIN bf
    ON bf.Program_ID = p.Program_ID 
    AND bf.Year_ID = y.Year_ID
ORDER BY
  y.Year_ID,
  p.Program_ID

http://sqlfiddle.com/#!3/9c1ec/13