我有以下表架构:
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
现在,该查询当然不起作用......我需要的本质上是将每个基金的所有价格 * 单位相加,然后将每个注册的所有这些相加,然后将每个投资组合的所有这些相加。
每个投资组合可以有多个注册,每个注册可以有多个基金,每个基金可以有多个交易。
最后一项在这方面抛出了一个棘手的问题,可能有 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