2014-05-15 68 views
0

首先,我不確定標題是否能夠完整地描述我正在嘗試存檔的內容 - 所以請根據您的看法進行修改。根據兩個條件查詢連接表

我在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

我建議你與*結果編輯您的問題*您希望看到,也包括在SQL小提琴樣本數據。 –

+0

@user:你的問題有點模糊。這條線不反映你的問題陳述與數據'例如,year_ID 1 + program_ID 2分配$ 1000,然後year_ID 1 + program_ID 2轉移$ 100 year_ID 2 + program_id 1.' –

+0

@GordonLinoff我無意中寫了寫示例數據,我已更新。我希望它更好理解?在底部鏈接的SQL小提琴有更多的數據和所有表格的樣本。 http://sqlfiddle.com/#!3/9c1ec/1/0 – user82320

回答

1

我會根據Program_ID和Year_ID在某些CTE中對預算進行總結,並將它們加入到計劃和年表中,以避免多次彙總預算值。

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

+0

謝謝!我欠你一點感激之情。我向你的SQL真棒!現在閱讀CTE的:) – user82320

+1

非常歡迎!樂於幫助 :) –