2

我有以下表架构:

    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
4

2 回答 2

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
于 2012-12-27T21:58:59.247 回答
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 的总和。您可以将此作为子查询使用其他 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)

NULL 将其放入此结果集中,因为这就是 WITH ROLLUP 所做的。这个结果集中只有 ID;即使名称不是,ID 也可能是唯一的。投资组合、基金等的非唯一名称会严重混淆 GROUP BY。因此,我之前对检索名称的评论。

于 2012-12-27T22:09:09.153 回答