我在群组功能中遇到了我的查询意外结果。我正在使用以下3个表:
sale
列AccountId
,NetAmount
,quantity
,date
Purchase
列AccountId
,NetAmount
,quantity
,date
Account
列AccountId
,AccountName
我制作了一个存储过程,它接受两个输入:Date1
和Date2
。
我需要计算以下内容:
Account.AccountName
NetAmount
Purchase
的总和
NetAmount
Sale
Date
加Date
之前NetAmount
Purchase
NetAmount
的总和 - Sale
Date
Date1
Date2
之和NetAmount
和Sale
之间LI>
Purchase
和Date
Date1
的{{1}}和Date2
的{{1}}的总和
我目前正在这样做:
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倍。
谁能告诉我该怎么办?
答案 0 :(得分: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