2016-08-02 6 views
1

私はMSSQLのデータベースからデータを取得しています。このデータのうち、私はクライアントエントリを作成した人と、このクライアントから最初の支払いを受けた人を決定したいと考えています。クエリの結果が多すぎます

クライアントには、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 
; 

私はPaymentUserのためのネストされたSELECTステートメントに "TOP 1" を追加しようとしたが、それは何の違いが行われていません。

+2

ここから始めましょう。 http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/ –

+1

'top 1'で' cross apply'を使うことができます: 'FROM tblBookings bが適用されます(tblPayments pからb.BookingID = p.BookingIDのトップ1を選択してください)。pは –

+0

です。いくつかのテーブルを含む質問をするときに使うもう1つのツールです。 http://sqlfiddle.com/。あなたのスキーマとデータが分からなければ、 'TOP 1'を最初のselectに入れて、' c.DateOfCreation'でクエリ全体を並べます。 – squillman

答えて

0

をあなたはtop 1cross applyを使用することができます。

FROM tblBookings b cross apply (select top 1 * from tblPayments p where b.BookingID = p.BookingID) as p

+0

ありがとう、これは私のために働いた – Stephen

+1

@stephen - "最初の"支払いが必要な場合、これはこの回答の "トップ1"の支払いと同じではありません。 FWIW。 – Chains

-2

tblPaymentsにはプライマリキー列IDがあるとします。それが本当であるならば、あなたはこのなステートメントを使用することができます。

FROM tblBookings b 

INNER JOIN tblPayments p ON p.ID = (
    SELECT TOP 1 ID 
    FROM tblPayments 
    WHERE BookingID = b.BookingID 
    AND DeleteMark != 1 
    AND PaymentStatusID IN (1,2) 
    ORDER BY DateOfCreation) 
+1

私はこのコードは依然として重複を引き起こすと思います。問題はあなたが持っている最初の参加です。 –

+0

私はあなたに同意していない。 PKによって制限された最初のJOINの結果。 –

0

代わりにテーブルtblPaymentsのこのようなサブクエリを指定:

(SELECT TOP 1 BookingID, UserID, DateOfCreation 
FROM tblPayments 
WHERE DeleteMark != 1 
AND PaymentStatusID IN (1,2) 
ORDER BY DateOfCreation) as p 
関連する問題