2010-08-13 82 views
1

我收到了错误的查询结果,我正在使用3个表格 1.销售与列AccointId,NetAmount,数量,日期 2.购买colums AccounId,NetAmount,数量,日期 3.Account colums ACCOUNTID,帐户名sql查询中的迭代

我做的,采用两个输入像日期1存储过程,日期2

我需要我的是购买的NetAmount的Account.AccountName,总结 - 卖的NetAmoount的总和日期以下日期及日期销售净额的销售净额金额总额日期1至日期2,销售净额金额总额日期1至日期2之间的日期2

我使用这个

SELECT a.SecurityName, 
     Sum(d.NetAmount) - Sum(e.NetAmount)As 'Opening Amount', 
     Sum(d.Quantity) - Sum(e.Quantity) As 'Opening Number', 
     Sum(d.NetAmount)/Sum(d.Quantity)As 'Opening Rate', 
     Sum(s.Quantity) As 'Number', 
     Sum(s.NetAmount)/Sum(s.Quantity) As 'Rate', 
     Sum(s.NetAmount) As 'Amount', 
     Sum(p.Quantity) As 'Number', 
     Sum(p.NetAmount)/Sum(p.Quantity) As 'Rate', 
     Sum( p.NetAmount) AS 'Amount', 
     IsNull(Sum(d.Quantity), 0) + (Sum(p.Quantity)) - IsNull((Sum(s.Quantity)), 0) As 'Closing Number', 
     IsNull(Sum(d.NetAmount),0)+(Sum(p.NetAmount)) -IsNull((Sum(s.NetAmount)),0) As 'Closing Amount', 
     IsNull(Sum(d.Rate),0)+(Sum(p.Rate))-IsNull((Sum(s.Rate)),0) As 'Closing Rate' 
    FROM Sale s 
left Join SecurityAccount a ON s.SecurityAccountId = a.SecurityAccountId 
Right JOIN Purchase p ON a.SecurityAccountId = p.SecurityAccountId 
Left JOin Purchase d On a.SecurityAccountId=d.SecurityAccountId 
        And d.Date < @PeriodStart 
Left Join Sale e On a.SecurityAccountId=e.SecurityAccountId 
       And e.Date < @PeriodStart 
Group by a.SecurityName 

End" 

所以我得到的值的3倍于预期

谁能告诉我我应该怎么办 或向右查询???

在此先感谢

回答

1

你被同场SecurityAccountId连接表4倍。每次连接都会导致结果行的乘积。我看到的唯一方法是用分组创建4个子查询,然后在主查询中使用这些结果。这应该工作,如果我没有错误:)

SELECT a.SecurityName, 
     (d.SumNetAmount - e.SumNetAmount) AS 'Opening Amount', 
     (d.SumQuantity - e.SumQuantity) AS 'Opening Number', 
     (d.SumNetAmount)/d.SumQuantity) AS 'Opening Rate', 
     s.SumQuantity AS 'Number', 
     (s.SumNetAmount/s.SumQuantity) AS 'Rate', 
     s.SumNetAmount AS 'Amount', 
     p.SumQuantity AS 'Number', 
     (p.SumNetAmount/p.SumQuantity) AS 'Rate', 
     p.SumNetAmount AS 'Amount', 
     (ISNULL(d.SumQuantity, 0) + p.SumQuantity - ISNULL(s.SumQuantity, 0)) AS 'Closing Number', 
     (ISNULL(d.SumNetAmount,0) + p.SumNetAmount - ISNULL(s.SumNetAmount,0)) AS 'Closing Amount', 
     (ISNULL(d.SumRate,0) + p.SumRate - ISNULL(s.SumRate,0)) As 'Closing Rate' 
FROM SecurityAccount a 
LEFT JOIN (SELECT SecurityAccountId, 
     SUM(Quantity) AS 'SumQuantity', 
     SUM(NetAmount) AS 'SumNetAmount', 
     SUM(Rate) AS 'SumRate' 
FROM Sale) AS s ON a.SecurityAccountId = s.SecurityAccountId 
LEFT JOIN (SELECT SecurityAccountId, 
     SUM(Quantity) AS 'SumQuantity', 
     SUM(NetAmount) AS 'SumNetAmount', 
     SUM(Rate) AS 'SumRate' 
FROM Sale WHERE Date < @PeriodStart) AS e ON a.SecurityAccountId = e.SecurityAccountId 
LEFT JOIN (SELECT SecurityAccountId, 
     SUM(Quantity) AS 'SumQuantity', 
     SUM(NetAmount) AS 'SumNetAmount', 
     SUM(Rate) AS 'SumRate' 
FROM Purchase) AS p ON a.SecurityAccountId = p.SecurityAccountId 
LEFT JOIN (SELECT SecurityAccountId, 
     SUM(Quantity) AS 'SumQuantity', 
     SUM(NetAmount) AS 'SumNetAmount', 
     SUM(Rate) AS 'SumRate' 
FROM Purchase WHERE Date < @PeriodStart) AS d ON a.SecurityAccountId = d.SecurityAccountId