我有两个表,一个代表证券所有权(每个证券中可能有一个以上的持股),另一个代表每个证券上的分布(每个证券上可能有一个以上的分布)。我想计算在每个证券上支付的总分配。
因此,给定的输入如下
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)。
使用我的示例输入和失败的SQL的SQLFiddle可以在http://sqlfiddle.com/#!9/e3caa/3/0上看到
所有建议都很感激。
发布于 2016-03-15 19:08:30
最简单的解决办法:
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
发布于 2016-03-15 18:59:29
这项工作按要求进行:
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
它通过预先计算在单独子查询中的总份额和总分布来工作,然后将它们连接到一起,生成产品,给出正确的值。
https://stackoverflow.com/questions/36019583
复制相似问题