Вы можете попытаться компенсировать повторяющиеся строки Акции, используя COUNT(DISTINCT)
:
SELECT Trip.TripID, Count(DISTINCT Promotion.PromotionID) AS [Number Of Promotions],
Sum(PromotionCost.Cost) AS SumOfCost
FROM Trip INNER JOIN Promotion ON Trip.TripID = Promotion.TripID
INNER JOIN PromotionCost ON Promotion.PromotionID = PromotionCost.PromotionID
GROUP BY Trip.TripID;
Что происходит, так это то, что по умолчанию COUNT()
считает строки, созданные после всех соединений. Для TripID XYZ123 существует четыре стоимости продвижения, поэтому четыре строки, хотя TripId встречается несколько раз среди этих четырех строк.
Проще визуализировать, если вы попробуете подобный запрос без GROUP BY:
SELECT Trip.TripID, Promotion.PromotionID, PromotionCost.Cost
FROM Trip INNER JOIN Promotion ON Trip.TripID = Promotion.TripID
INNER JOIN PromotionCost ON Promotion.PromotionID = PromotionCost.PromotionID;
Вы увидите четыре строки для XYZ123 (с дублирующимися значениями PromotionID) и одну строку для GHR752.
Повторно комментирует, что MS Access не поддерживает COUNT(DISTINCT)
: если это так, то вам не следует делать это в одном запросе. Сделайте это в двух запросах:
SELECT Trip.TripID, SUM(PromotionCost.Cost) AS SumOfCost
FROM Trip INNER JOIN Promotion ON Trip.TripID = Promotion.TripID
INNER JOIN PromotionCost ON Promotion.PromotionID = PromotionCost.PromotionID
GROUP BY Trip.TripID;
SELECT Trip.TripID, Count(Promotion.PromotionID) AS [Number Of Promotions]
FROM Trip INNER JOIN Promotion ON Trip.TripID = Promotion.TripID
GROUP BY Trip.TripID;
Альтернатива - очень запутанное решение с использованием подзапросов, описанных в этой статье в Microsoft:
http://blogs.msdn.com/access/archive/2007/09/19/writing-a-count-distinct-query-in-access.aspx