在SQL查询中迭代

时间:2010-08-13 19:36:14

标签: sql

我在群组功能中遇到了我的查询意外结果。我正在使用以下3个表:

  1. saleAccountIdNetAmountquantitydate
  2. PurchaseAccountIdNetAmountquantitydate
  3. AccountAccountIdAccountName
  4. 我制作了一个存储过程,它接受两个输入:Date1Date2

    我需要计算以下内容:

    • Account.AccountName
    • NetAmount
    • Purchase的总和
    • NetAmount Sale DateDate之前NetAmount
    • 的总和
    • Purchase NetAmount的总和 - Sale Date Date1 Date2之和NetAmountSale之间LI>
    • PurchaseDate
    • 之间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倍。

    谁能告诉我该怎么办?

1 个答案:

答案 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