MSSQL 데이터베이스에서 일부 데이터를 가져옵니다. 이 데이터에서 나는 클라이언트 항목을 만든 사람과이 클라이언트에서 첫 번째 지불을 한 사람을 결정하려고합니다.쿼리 결과가 너무 많습니다.
하나의 예약/조회에 대해 많은 지불 항목이있을 수 있으며 현재 나의 지불은 각 지불에 대한 결과를 보여줍니다. 첫 번째 지불 항목 만 표시하도록 출력을 제한하려면 어떻게합니까?
내 쿼리 : 나는 PaymentUser에 대한 중첩 된 SELECT 문에 "TOP 1"을 추가했는데,이 차이를하지
SELECT
c.FirstName,
c.LastName,
c.PostalCode,
o.OriginOfEnquiry,
s.SuperOriginName,
c.DateOfCreation,
DATEDIFF(day, c.DateOfCreation, p.DateOfCreation) AS DaysToPayment,
pc.PackageName,
CONCAT(u.FirstName, ' ', u.LastName) AS CreateUser,
(SELECT CONCAT(u.FirstName, ' ', u.LastName)
WHERE u.UserID = p.UserID) AS PaymentUser
FROM tblBookings b
INNER JOIN tblPayments p
ON b.BookingID = p.BookingID
INNER JOIN tblEnquiries e
ON e.EnquiryID = b.EnquiryID
INNER JOIN tblCustomers c
ON c.CustomerID = e.CustomerID
INNER JOIN tblOrigins o
ON o.OriginID = e.OriginID
INNER JOIN tblSuperOrigins s
ON s.SuperOriginID = o.SuperOriginID
INNER JOIN tblBookingPackages bp
ON bp.bookingID = p.BookingID
INNER JOIN tblPackages pc
ON pc.PackageID = bp.packageID
INNER JOIN tblUsers u
ON u.UserID = c.UserID
WHERE c.DateOfCreation >= '2016-06-01' AND c.DateOfCreation < '2016-06-30'
AND p.PaymentStatusID IN (1,2)
AND e.CustomerID = c.CustomerID
AND p.DeleteMark != 1
AND c.DeleteMark != 1
AND b.DeleteMark != 1
;
.
여기서부터 시작하는 것이 좋습니다. http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/ –
'top 1'과 함께'cross apply'를 사용할 수 있습니다 :'FROM tblBookings b 교차 적용 (tblPayments p에서 b.BookingID = p.BookingID의 상단 1 *을 선택하십시오.) ' –
여러 테이블이 포함 된 질문을 할 때 사용할 수있는 또 다른 유용한 도구가 있습니다. http://sqlfiddle.com/. 스키마와 데이터를 알지 못하면 초기 선택에 'TOP 1'을 넣고 전체 쿼리를'c.DateOfCreation'으로 정렬합니다. – squillman