2017-05-05 1 views
0

다음 쿼리를 사용하여 Total 판매를 받고 있습니다.더 많은 테이블을 결합 할 때 집계 함수가 잘못된 값을 리턴합니다.

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' 

이 올바른지 예약 ID 당 여러 AirTraveler,있을 수 있기 때문에 국지적 집계 함수가 잘못된 값을 반환 [TotalSale]의 잘못된 결과를주고있다 . 집계 함수 문제를 해결하기 위해 무엇을 할 수 있습니까?

저는 실제로 붙어 있습니다.

SQL Server를 사용하고 있습니다.

미리 감사드립니다.

+0

확실히 사실 결코 생각하여 'bookingdetail'에 많은 행이 있기 때문에 total이 옳다. ? 어쨌든 해결책은 합류하기보다는'존재하는 곳 '을 사용하는 것입니다. –

+0

@ Nick.McDermaid : WHERE EXISTS를 사용하여 [AT]. [FareDetails] .query ('string (/ AirFareInfo [1]/PT [1])')의 값을 얻으려면 어떻게해야합니까? 앞서 언급 한 쿼리를 편집하십시오. –

답변

0

시험 또는 아무것도하지만 이중 계산에 헤더 테이블을 유발하는 낮은 수준의 테이블에 합류 할 때이 아마 브래킷을 닫는/약간의 구멍을 빠져

에 합류하기 전에, 당신은 그것을 사전 집계 할 수 없음 별칭은 그러나 희망 당신은 그것을 밖으로 일할 수 또한 나는 당신의 VARCHAR는 크기를 던져 준

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' 

- 당신이 하나있을거야 이렇게하지 않으면 내가 그렇게 사건이

관련 문제