2010-08-13 13 views
1

je me trompe résultat de la requête dans la fonction de groupe, j'utilise 3 tables 1. vente avec colonnes AccointId, NetAmount, quantité, date 2. Colums d'achat AccounId, NetAmount, quantité, date 3.Account cOLONNES AccountId, AccountNameItération en requête sql

i fait une procédure stockée qui prend deux entrées comme Date1, Date2

je suis exigé que Account.AccountName, somme des NetAmount d'achat - sOMME de NetAmoount de vente de Date ci-dessous Date amd Somme du montant net de l'achat de la somme nette de vente de la date entre la date1 et la date2, somme du montant net de la vente et de l'achat de la date entre la date1 et la date2

J'utilise ce

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" 

donc je suis en train de valeurs 3 fois plus que prévu

quelqu'un peut me dire ce que dois-je faire ou à droite requête ???

merci à l'avance

Répondre

1

Vous rejoignez les tables 4 fois par le même champ SecurityAccountId. Chaque jointure entraînera la multiplication des lignes de résultats. La seule façon que je vois est de créer 4 sous-requêtes avec le regroupement, puis en utilisant ces résultats dans la requête principale. Cela devrait fonctionner, si je n'ai pas d'erreurs :)

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