簡體   English   中英

SQL中SUM的求和

[英]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)

SQL小提琴

它通過預先計算單獨的子查詢中的股份總數和總分配,然后將它們連接在一起以制造產品,從而給出正確的值來工作。

最簡單的解決方法:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM