[英]SUMs by SUMs in SQL
我有两个表,一个表代表证券所有权(每个证券中可能有多个控股),另一个表代表每个证券的分布(每个证券中可能有多个分配)。 我想计算每种证券支付的总发行额。
因此,给定输入像
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)在上面的示例中]。
可以在http://sqlfiddle.com/#!9/e3caa/3/0上看到带有我的示例输入和失败SQL的SQLFiddle
所有建议表示赞赏。
这可以按要求工作:
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)
它通过预先计算单独的子查询中的股份总数和总分配,然后将它们连接在一起以制造产品,从而给出正确的值来工作。
最简单的解决方法:
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.行如果您在一笔,然后在乙总结,再乘,您双击计数是在加入得到了重复的行。 如果相乘,然后相加,则仅将行与它们的“伙伴”行相乘。
重复计算联接结果带来的问题是我在SQL中看到的最常见的错误之一,所以要当心了!
SQL小提琴: http ://sqlfiddle.com/#!9 / e3caa / 14
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.