2012-12-27 73 views
1

我有以下表模式:總和與ID匹配的MySQL

tbl_portfolio 
    ---------- 
    id (auto number) 
    name 

-

tbl_registration 
    ---------------- 
    id(auto number) 
    name 
    portfolio_id (FK to tbl_portfolio.id) 

-

tbl_fund 
    --------- 
    id (auto number) 
    registration_id (FK to tbl_registration.id) 

-

 tbl_transaction 
    --------------- 
    id (auto number) 
    fund_id (FK to tbl_fund.id) 
    type 
    shares 
    price 

我需要創建一個查詢,在僞代碼將做到以下幾點:

 SELECT port.*, SUM ALL transactions for each portfolio, 
     FROM tbl_portfolio port 
     INNER JOIN tbl_registration reg ON reg.portfolio_id = port.id 
     LEFT JOIN tbl_fund fund on fund.registration_id = reg.id 
     LEFT JOIN tbl_transaction trans ON trans.fund_id = fund.id 

當然現在該查詢將無法正常工作......我所需要主要是總結所有的價格*每個基金單位,然後將這些數據加起來進行每次註冊,然後將所有這些數據進行彙總。

每個投資組合可以有多個註冊,每個註冊可以有多個基金,每個基金可以有多個交易。

最後一個在這裏拋出一個stickler的項目,可能會有10個或100個投資組合計數,所以我不知道如何編寫查詢,更不用依賴子查詢的有效方式編寫它那會導致它的表現嚴重不佳。

謝謝你的幫助!

編輯: PinnyM的答案工程和查詢數據正確 - 但我應該擴大充分的需要。

除了tbl_transaction,還有一個tbl_distri和tbl_div。兩者的fund_id均爲FK至tbl_fund.id。我需要獲取tbl_distri.amount和tbl_div.units的SUM。 所以全僞查詢是東西的效果:

 SELECT port.*, SUM ALL transactions for each portfolio, SUM(div.units), SUM(distri.amount) 
     FROM tbl_portfolio port 
     INNER JOIN tbl_registration reg ON reg.portfolio_id = port.id 
     LEFT JOIN tbl_fund fund on fund.registration_id = reg.id 
     LEFT JOIN tbl_transaction trans ON trans.fund_id = fund.id 
     LEFT JOIN tbl_distri distri on distri.fund_id = fund.id 
     LEFT JOIN tbl_div div on div.fund_id = fund.id 
+0

......我假設'tbl_fund'中有更多列,或者說有什麼意義?另外,爲什麼要在所有內容上加上'tbl _...'前綴 - 這聽起來太吵了。 –

+0

你需要總結股份數量,價格,還是什麼?也就是說,「總計所有交易」的含義是什麼? – Melanie

+0

如果一個投資組合可以有多個註冊,那麼您從tbl_portfolio到tbl_registration的加入也需要是一個左加註。 – EvilBob22

回答

1

您是否嘗試過使用SUM()

SELECT port.*, SUM(trans.shares * trans.price) AS transaction_totals 
    FROM tbl_portfolio port 
    INNER JOIN tbl_registration reg ON reg.portfolio_id = port.id 
    LEFT JOIN tbl_fund fund on fund.registration_id = reg.id 
    LEFT JOIN tbl_transaction trans ON trans.fund_id = fund.id 
    GROUP BY port.id 
0

從你的問題來看,你正在尋找一個捲起SUM

 SELECT port.id AS port_id, 
       reg.id AS reg_id, 
       fund.id AS fund_id, 
       SUM (trans.shares * trans.price) AS net_asset_value 
     FROM tbl_portfolio port 
    INNER JOIN tbl_registration reg ON reg.portfolio_id = port.id 
    LEFT JOIN tbl_fund fund on fund.registration_id = reg.id 
    LEFT JOIN tbl_transaction trans ON trans.fund_id = fund.id 
    GROUP BY port.id, reg.id, fund.id WITH ROLLUP 

這會給你的ID的款項ID。您可以使用其他JOIN操作作爲子查詢來獲取文本名稱。

這會給這樣的結果:

port_id reg_id fund_id net_asset_value 
    1  1  1   150.00 
    1  1  2   100.00 
    1  1  NULL  250.00 (rollup of previous two lines) 
    1  2  1   24.00 
    1  2  4   80.00 
    1  2  NULL  104.00 (rollup of previous two lines) 
    1  NULL NULL  354.00 (rollup at portfolio level) 
    3  1  1   40.00 
    3  1  2   50.00 
    3  1  NULL   90.00 (rollup of previous two lines) 
    3  2  1   14.00 
    3  2  4   60.00 
    3  2  NULL   74.00 (rollup of previous two lines) 
    3  NULL NULL  164.00 (rollup at portfolio level) 
    NULL  NULL NULL  518.00 (grand total) 

中的空白,使其成爲此ResultSet,因爲這是ROLLUP做什麼。此結果集只包含其中的ID;大概這些ID是唯一的,即使名字不是。投資組合,基金等的非唯一名稱將非常糟糕地混淆了GROUP BY。因此,我之前對檢索名稱的評論。

+0

Ollie,我相信我很困惑你最後的評論。上面的查詢返回每個基金的總和,以及相關的基金ID,REG ID和端口ID。如果我想將所有這些總結在一起併爲每個portfolio_id返回它,那麼您的建議是什麼? – w00tw00t111

+0

Ollie,感謝您的擴大編輯!因此,如果將查詢結果加載到使用PHP的表格中,您將如何顯示彙總,而不是導致彙總的後續值?這是更高效的,然後直接彙總數據(即沒有彙總) – w00tw00t111

+0

從你的問題,你不知道你想要你的總和捲起什麼水平。你能澄清嗎? –