2017-05-05 44 views
0

我使用以下查询获取总销售额。当加入更多表格时,聚合函数返回不正确的值

SELECT SUM([B].[TotalSale]) 
FROM [dbo].[BookingDetail] [BF] WITH (READPAST) 
INNER JOIN [dbo].[Booking] [B] WITH (READPAST) ON [B].[BookingDetailID] = [BF].[ID] 
WHERE [BF].[MarketID] = '2' 

我想添加另一列来获得总销售额。 为此,我必须与名为AirTraveler的另一个表进行联接。

但是,一旦我添加一个新表来查询

SELECT 
SUM([B].[TotalSale]) , 
SUM(CASE WHEN [B].[TravelSectorID] = 3 AND [B].[BookingStatusID] IN (16, 20, 22, 23) THEN COALESCE([B].[TotalSale], 0.0) 
     WHEN ([B].[TravelSectorID] = 1 AND [B].[IsDomestic] = 1 AND CONVERT(varchar, [AT].[FareDetails].query('string(/AirFareInfo[1]/PT[1])')) = 'FlightAndHotel') THEN [AT].[TotalSale] 
     ELSE 0 END) AS [GrossSale] 
FROM [dbo].[BookingDetail] [BF] WITH (READPAST) 
INNER JOIN [dbo].[Booking] [B] WITH (READPAST) ON [B].[BookingDetailID] = [BF].[ID] 
LEFT OUTER JOIN [dbo].[AirTraveler] [AT] WITH(READPAST) ON [B].[ID] = [AT].[BookingID] 
WHERE [BF].[MarketID] = '2' 

它给的[TotalSale] .the聚合函数返回错误值,因为有可能是每个订单ID多AirTraveler,这是正确的不正确的结果。我能做些什么来解决聚合函数问题?

我实际上被卡住了。

我正在使用SQL Server。

在此先感谢。

+0

当然你的即使在此之前,总数也是正确的,因为'bookingdetail'有很多行?无论如何,解决方案是使用'WHERE EXISTS'而不是加入。 –

+0

@ Nick.McDermaid:使用WHERE EXISTS,我如何获得[AT]的值[FareDetails] .query('string(/ AirFareInfo [1]/PT [1])')。你能编辑上述查询吗? –

回答

0

没有测试或任何东西,但是当你加入到导致一个头表双数的更低级表,你可以把它加入

之前,这可能是缺少一些打开/关闭支架预聚合它和别名,但希望你能做得出来

SELECT 
SUM([B].[TotalSale]) , 
SUM(CASE WHEN [B].[TravelSectorID] = 3 
AND [B].[BookingStatusID] IN (16, 20, 22, 23) 
THEN COALESCE([B].[TotalSale], 0.0) 
     WHEN ([B].[TravelSectorID] = 1 AND [B].[IsDomestic] = 1 
     THEN [AT].[TotalSale] 
     ELSE 0 END) AS [GrossSale] 
FROM [dbo].[BookingDetail] [BF] WITH (READPAST) 
INNER JOIN [dbo].[Booking] [B] WITH (READPAST) ON [B].[BookingDetailID] = [BF].[ID] 
LEFT OUTER JOIN 
(
SELECT BookingID, SUM(CASE WHEN 
CONVERT(varchar(50), [FareDetails].query('string(/AirFareInfo[1]/PT[1])')) 
= 'FlightAndHotel') THEN [TotalSale] ELSE 0 END) TotalSale 
FROM [dbo].[AirTraveler] [AT] WITH(READPAST) 
GROUP BY BookingID 
) AT 
ON [B].[ID] = [AT].[BookingID] 
WHERE [BF].[MarketID] = '2' 

而且我给你的VARCHAR蒙上了大小 - 我认为,如果你不这样做,这将是1,因此你的情况是不正确的