Это ожидаемый результат, когда есть больше чем одна связанная строка в любом tblOrderSurcharge
или tblOrderDiscount
... у вас есть неявный пол перекрестного соединения между строками из этих двух таблиц.
Существует несколько подходов к «исправлению» этого, если вам нужны итоги, возвращенные в одном выражении.
Один из вариантов - использовать встроенные представления для выполнения итогов, а затем объединить строки. По существу, запускайте отдельные запросы, чтобы получить итоговые данные из каждой таблицы, а затем объедините результаты по уникальному ключу. Например:
SELECT o.IdNoLocation
, o.Frequency
, ISNULL(o.Spend, 0) AS Spend
, ISNULL(s.Surcharges), 0) AS Surcharges
, ISNULL(s.Discounts), 0) AS Discounts
FROM (SELECT ooo.IdNoLocation
, COUNT(DISTINCT ooo.EncodedId) AS Frequency
, SUM(ooo.Subtotal) AS Spend
FROM tblOrder ooo
WHERE ooo.BusinessDate BETWEEN '2014-01-01' AND '2014-12-31'
AND ooo.IdNoLocation <> 'X'
GROUP BY ooo.IdNoLocation
) o
LEFT
JOIN (SELECT oso.IdNoLocation
, SUM(oss.Amount) AS Surcharges
FROM tblOrderSurcharge oss
JOIN tblOrder oso
ON oso.OrderId = oss.OrderId
WHERE oso.BusinessDate BETWEEN '2014-01-01' AND '2014-12-31'
AND oso.IdNoLocation <> 'X'
GROUP BY oso.IdNoLocation
) s
ON s.IdNoLocation = o.IdNoLocation
LEFT
JOIN (SELECT odo.IdNoLocation
, SUM(odd.Amount) AS Discounts
FROM tblOrderDiscount odd
JOIN tblOrder odo
ON odo.OrderId = odd.OrderId
WHERE odo.BusinessDate BETWEEN '2014-01-01' AND '2014-12-31'
AND odo.IdNoLocation <> 'X'
GROUP BY odo.IdNoLocation
) d
ON d.IdNoLocation = o.IdNoLocation
(Это не проверяется, только стол проверил Запуск каждый из видовых рядных запросов (о, s, d) и проверить результаты от каждого из этих запросов, как вы ожидаете тогда.. , запустите весь запрос, чтобы объединить строки ... во внешнем запросе, мы сделаем «внешние» соединения и обработаем «отсутствующие» строки и заменим нули нулями)
Другой вариант - использовать коррелированные подзапросы в списке SELECT.
Можете ли вы предоставить образцы данных и ожидаемый результат? –
Завышенный 'SUM()' из-за 'JOIN' указывает, что ваших критериев недостаточно для соответствия строк между таблицами 1: 1. Может ли 'o.OrderID' иметь несколько записей в' tblOrderDiscount'? –
Да, при заказе (o.OrderID) может быть применено более одной скидки (от TblOrderDiscount). – marshpipes