次のテーブル スキーマがあります。
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
もちろん、そのクエリは機能しません...私が本質的に必要としているのは、各ファンドのすべての価格 * 単位を合計し、次に登録ごとにそれらを合計し、次にポートフォリオごとにそれらをすべて合計することです。
各ポートフォリオは複数の登録を持つことができ、各登録は複数のファンドを持つことができ、各ファンドは複数のトランザクションを持つことができます。
これに執着している最後の項目は、数十または数百のポートフォリオがある可能性があるため、クエリの書き方がわかりません。ましてや、それを引き起こすサブクエリに依存しない効果的な方法で書きます。パフォーマンスが著しく低下する。
お手伝いありがとう!
編集: PinnyM の回答は機能し、データを正しくクエリしますが、完全な必要性を拡張する必要があります。
tbl_transaction の他に、tbl_distri と tbl_div もあります。どちらも fund_id を tbl_fund.id への FK として持っています。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