首先,我不确定标题是否恰当地描述了我想要实现的目标 - 所以请按照您的意愿进行修改。
我在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以及其中一个不起作用的查询。
答案 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