首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >按金额计算的SQL总数

按金额计算的SQL总数
EN

Stack Overflow用户
提问于 2016-03-15 18:45:01
回答 2查看 49关注 0票数 0

我有两个表,一个代表证券所有权(每个证券中可能有一个以上的持股),另一个代表每个证券上的分布(每个证券上可能有一个以上的分布)。我想计算在每个证券上支付的总分配。

因此,给定的输入如下

代码语言:javascript
运行
复制
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

输出应该是

代码语言:javascript
运行
复制
Security ID    total distribution
 44               20
 45               12
 55               30

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

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

所有建议都很感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-15 19:08:30

最简单的解决办法:

代码语言:javascript
运行
复制
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

票数 1
EN

Stack Overflow用户

发布于 2016-03-15 18:59:29

这项工作按要求进行:

代码语言:javascript
运行
复制
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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36019583

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档