2011-09-06 3 views
0

나는이 에이전트에 대한 모든 예약 및 예약에 대한 모든 객실을 얻고 일부 단순히 계산을 수행하는 다음 MySQL의 쿼리 (테이블이 booking_record 1 개 에이전트가 수 있도록 명시되어하나의 참조에 대해 두 행을 생성하는 MySQL 쿼리를 어떻게 중지합니까?

Select a.code, a.name, a.areacode, a.agentgroup, 
    Sum(br.basicprice) As TotalRevenueYTD, 
    Sum(b.adults + b.children + b.infants) As Pax, 
    Count(br.bookingref) As Bookings 
From booking_record br 
    Inner Join agent a On br.agentref = a.code 
    Inner Join bookingroom b On b.bookingref = br.bookingref 
Where br.bookingdate > '2011-01-01' And br.bookingdate < Date(Now()) 
Group By br.agentref 

을 agentref -> a.code). 대리인은 많은 예약을 할 수 있으며, 예약은 많은 방을 가질 수 있습니다. 이 특별한 경우에는 하나의 예약에 두 개 이상의 객실이있는 경우 행이 두 번 이상 반환됩니다 (따라서 기본 가격은 두 번 계산되고 예약은 두 번 계산되므로) 내 수익과 예약이 잘못 나오는 것입니다.

정확한 정보를 어떻게 반환 할 수 있습니까?

감사합니다. Daniel.

+4

** 즉석 문제 ** - 논리에 문제가 있습니다. MySQL은 집계되지 않은 필드에 의해'GROUP'을 허용하여 무작위 데이터를 유도합니다. ** 당신의 SELECT LIST **에 있지 않은 필드에 의해 그룹화됩니다. 이것은 주요 적색 플래그입니다. – JNK

+1

@JNK, br.agentref = a.code'이므로 OP는 실제로 선택 목록에있는'a.code '로 그룹화됩니다. – Johan

+1

각 테이블에 PK가 무엇인지 포함하여 질문에 테이블 정의를 추가 할 수 있습니까? –

답변

2

어때요? @JNK가 지적 하듯,이 코드 a.code 테이블 agent의 고유 또는 기본 키는 것을 전제로하는

SELECT a.code, a.name, a.areacode, a.agentgroup 
     , Sum(br.basicprice) As TotalRevenueYTD 
     , sum(b1.pax) As Pax 
     , Count(br.bookingref) As Bookings 
FROM booking_record br 
INNER JOIN agent a On br.agentref = a.code 
INNER JOIN (
    SELECT b.bookingref, Sum(b.adults + b.children + b.infants) as pax 
    FROM bookingroom b 
    GROUP BY b.bookingref) AS b1 ON b1.bookingref = br.bookingref 
WHERE br.bookingdate >= '2011-01-01' 
    AND br.bookingdate <= Date(Now()) 
GROUP BY a.code 

참고. 그것이 맞으면 제대로 작동 할 것입니다.
이 (가) 아닌 경우 indeterminite 결과가 나타납니다.

+0

감사합니다. . –

관련 문제