2016-08-01 7 views
0

Я пытаюсь получить ОСТАТОКАгрегатная функция возвращает неточные результаты

where balance = SUM(pod.Quantity) + SUM(iob.OpeningBalance) 

Запрос возвращает следующий вывод:

ItemName Balance 
------------------ 
Item1  35 

, но он должен быть

ItemName Balance 
------------------ 
Item1   25 

Запрос:

SELECT 
    i.ItemName, 
    SUM(pod.Quantity) + SUM(iob.OpeningBalance) AS Balance 
FROM 
    dbo.Items i 
LEFT JOIN 
    dbo.PurchaseOrderDetails pod ON i.ItemID = pod.ItemID 
LEFT JOIN 
    ItemOpeningBalances iob ON i.ItemID = iob.ItemID 
GROUP BY 
    i.ItemName 

Items стол:

+--------+----------+ 
| ItemID | ItemName | 
+--------+----------+ 
|  1 | Item1 | 
+--------+----------+ 

ItemOpeningBalances стол:

+-------------------+-----------------+-----------------+ 
| OpeningBalanceID | ItemID   | OpeningBalance |  
+-------------------+-----------------+-----------------+ 
|     1 | 1    |  10   | 
+-------------------+-----------------+-----------------+ 

PurchaseOrderDetails стол:

+-----------------------+--------+----------+ 
| PurchaseOrderDetailID | ItemID | Quantity | 
+-----------------------+--------+----------+ 
|     1 | Item1 |  5 |   
|     2 | Item1 |  10 |     
+-----------------------+--------+----------+ 
+0

его, потому что без 'группы by' запрос вернет 2 строки с начальным сальдо 10 в обоих рядах и количество, равное 5 и 10. Когда вы группируете начальный баланс, становится 20 в количестве 15. Поскольку обе эти вещи логически раздельны, вы должны разделить их по 2 запросам, а не группировать их вместе. – ughai

+0

Hi ughai thanks – Ayman

ответ

2

вы запрашиваете добавляете вверх открывающий баланс для каждой линии PurchaseOrderDetails.

Изменение к использованию суб запроса на PurchaseOrderDetails

SELECT 
    i.ItemName, 
    --SUM(pod.Quantity) + SUM(iob.OpeiningBalance) AS Balance 
    (pod.Quantity) + (iob.OpeiningBalance) AS Balance 
FROM dbo.Items i 
left JOIN 
(-- change to sum it in the sub query 
    select ItemId, Quantity = sum(Quantity) 
    from dbo.PurchaseOrderDetails 
    group by ItemId 
) pod 
    ON i.ItemID = pod.ItemID 
    left JOIN ItemOpeningBalances iob 
    ON i.ItemID = iob.ItemID 
--GROUP BY i.ItemName, 
--   i.ItemCode 
0

попробовать это,

SELECT 
    i.ItemName, 
    pod.PurQuantity + iob.OpeiningBalance AS Balance 
FROM dbo.Items i 
OUTER APPLY(SELECT SUM(pod.Quantity) AS PurQuantity 
      FROM dbo.PurchaseOrderDetails p 
      WHERE i.ItemID = p.ItemID 
      ) as pod 
left JOIN ItemOpeningBalances iob 
ON i.ItemID = iob.ItemID 
Смежные вопросы