【问题标题】:SUMs by SUMs in SQLSQL 中按 SUM 的 SUM
【发布时间】:2016-03-15 18:45:01
【问题描述】:

我有两张表,一张代表证券所有权(每种证券可能有不止一种持有),另一种代表每种证券的分配(每种证券可能有多种分配)。我想计算每种证券支付的总分配额。

因此,给定输入

Security ID    shares held
 44                100
 44                100
 45                200
 55                300


Security ID    distribution
 44               0.05
 45               0.06
 55               0.07
 55               0.03
 44               0.05

输出应该是

Security ID    total distribution
 44               20
 45               12
 55               30

问题是,SUM(A.sharecount)*SUM(B.distribution) 最终会重复计算某些位置,我得到的答案太大 [(80, 12, 60) 而不是 (20, 12 , 30) 在上面的例子中]。

SQLFiddle 与我的示例输入和失败的 SQL 可以在 http://sqlfiddle.com/#!9/e3caa/3/0 看到

感谢所有建议。

【问题讨论】:

  • 鉴于这种结构,你怎么知道哪个分布指的是哪个持有?
  • @MatteoTassinari 分配适用于共享其证券 ID 的每个头寸。在上面,证券 44 有两个头寸,每个头寸各 100 股,因此需要对 200 股进行分配。证券 44 有两次分配,总计每股 0.10 美元,因此证券 44 应支付总计 20 美元。
  • 你能用数学计算得到 20 美元吗?因为100*0.05 = 55x2 = $10
  • @JuanCarlosOropeza 证券 44 中有两个职位,每个职位有 100 股,因此总股数 = 200。证券 44 有两个分配,总计每股 0.10 美元。最终数学,200*.0.10 = 20 美元。
  • 我猜他的意思是200 * 0.10$ = 20$200*(0.05+0.05)

标签: mysql sql select sum


【解决方案1】:

最简单的修复:

SELECT
  A.instrumentID,
  SUM(A.sharecount * B.distribution)
FROM
    samplePortfolio A
INNER JOIN
    sampleDistributions B
ON
    A.instrumentID=B.instrumentID
GROUP BY
    A.instrumentID

这是一个修复的原因是连接将 A 中的 每一 行与 B 中的 每一 行匹配。如果你对 A 求和,然后对 B 求和,然后相乘,您将在连接过程中重复计算的行数加倍。如果你相乘,然后求和,你只是将行与它们的“伙伴”行相乘。

双重计算连接结果引起的问题是我在 SQL 中看到的最常见的错误之一,所以要当心!

SQL 小提琴:http://sqlfiddle.com/#!9/e3caa/14

【讨论】:

  • 看起来不对:ID 44 应该有 200 个共享,而不是 400
  • 公平点......再次,重复的结果。但是,由于 OP 所需的输出仅包括总分布,因此我假设其他列仅用于调试目的……我将进行编辑。
  • 我必须进行一些修改才能让它在我的实际情况下工作,但基本方法有效并且非常快。谢谢。
【解决方案2】:

这按要求工作:

SELECT
  S.instrumentID,
  S.shares,
  D.distribution,
  S.shares * D.distribution as total
FROM (
  SELECT instrumentID, SUM(sharecount) shares
  FROM samplePortfolio
  GROUP BY instrumentID
) S
JOIN (
  SELECT instrumentID, SUM(distribution) distribution
  FROM sampleDistributions
  GROUP BY instrumentID
) D USING(instrumentID)

SQL Fiddle

它的工作原理是预先计算单独子查询中的份额总数和总分布,然后将它们连接在一起以生成产品,并给出正确的值。

【讨论】:

    猜你喜欢
    • 2020-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多