2017-03-16 107 views
0

我有一個MS SQL Server的兩個表獲取最新的記錄,包括空

一個包含用戶信息

TBL_USER

UserID| Name   | Mail  |...many columns...| 
------+--------------+---------- +------------------+ 
    292 | John Smith | @@@@@@@@ | ...    | 
    293 | Anna Bennet | @@@@@@@@ | ...    | 
    294 | Mark Johnson | @@@@@@@@ | ...    | 

其他表是每個用戶的支付的登記冊,以UserID作爲我的TBL_USER表的外鍵

TBL_PAYMENT

UserID| PaymentID | Amount | PaymentDate | 
------+-----------+----------------------+ 
    292 | 782 | 378 | 02-17-2016 | 
    293 | 783 | 172 | 03-22-2016 | 
    292 | 784 | 395 | 03-28-2016 | 
    292 | 785 | 358 | 04-01-2016 | 
    293 | 786 | 826 | 05-07-2016 | 
    293 | 787 | 835 | 05-23-2016 | 

我希望做的是一個查詢語句或存儲過程帶來了表了最新的支付每個用戶的,並在同一個結果表空或任何其他靜態值,當用戶沒有做出任何類似支付這

UserID| Name   | PaymentID | Amount | PaymentDate | 
------+--------------+---------- +--------+-------------+ 
    292 | John Smith | 785 | 358 | 04-01-2016 | 
    293 | Anna Bennet | 786 | 786 | 05-07-2016 | 
    294 | Mark Johnson | NULL | NULL | NULL  | 

現在我有下面的語句,但這給了我最後一次付款每一個用戶的,只有當他們在真皮休閒包一個支付已經完成。我想在同一張表中報告一個缺失的報告。

SELECT 
    usr.UserID, 
    usr.UserName, 
    pay.PaymentID, 
    pay.Amount, 
    pay.PaymentDate 
FROM TBL_USER usr 
    LEFT OUTER JOIN TBL_PAYMENT pay ON usr.UserID = pay.UserID 
    INNER JOIN (
     SELECT UserID,MAX(PaymentDate) AS MAXDATE 
     FROM TBL_PAYMENT Group by UserID 
    ) latest ON pay.UserID = latest.UserID AND pay.PaymentDate = latest.MAXDATE 

任何人都可以幫我解決這個問題嗎?

+0

可以爲同一用戶複製付款日期嗎? –

+0

@ Gonzalo.-不,PaymentDate插入的服務器系統日期從「管理界面」以毫秒級精度調用,因此幾乎不可能有2個標識日期。 –

回答

1

使用窗口功能:

SELECT usr.UserID, usr.UserName, 
     pay.PaymentID, pay.Amount, pay.PaymentDate 
FROM TBL_USER usr LEFT OUTER JOIN 
    (SELECT pay.*, 
      ROW_NUMBER() OVER (PARTITION BY userId Order by PaymentDate DESC) as seqnum 
     FROM TBL_PAYMENT pay 
    ) pay 
     ON usr.UserID = pay.UserID AND seqnum = 1; 
0

如果PaymentDates是不是每個用戶重複,這應該做工精細

SELECT 
TBL_USER.UserId, TBL_USER.Name, pm.PaymentId, pm.Amount, pm.PaymentDate 
FROM TBL_USER 
LEFT JOIN (
    SELECT 
    U.USERID,.MAX(P.PaymentDate) AS MAXDATE 
    FROM TBL_USER U 
    INNER JOIN TBL_PAYMENT P on U.UserID = P.UserID 
    group by U.USERID 
) J 
on TBL_USER.UserID = J.UserID 
LEFT JOIN TBL_PAYMENT Pm on Pm.PaymentDate = J.MAXDATE 
+0

我收到以下錯誤:「無法找到列」P「或用戶定義的函數」P.MAX「;或名稱不明確。」此錯誤可能是因爲有兩個TBL_PAYMENT表聲明爲P –

+0

請參閱編輯。它容易發生錯字 –

0

更具可讀性與WITH子句 - 和完整的測試數據:

WITH 
-- input, don't use in real query 
tbl_user(UserID,Name,Mail) AS (
      SELECT 292,'John Smith','@@@@@@@@' 
UNION ALL SELECT 293,'Anna Bennet','@@@@@@@@' 
UNION ALL SELECT 294,'Mark Johnson','@@@@@@@@' 
) 
, 
tbl_payment(UserID,PaymentID,Amount,PaymentDate) AS (
      SELECT 292,782,378,DATE '2016-02-17' 
UNION ALL SELECT 293,783,172,DATE '2016-03-22' 
UNION ALL SELECT 292,784,395,DATE '2016-03-28' 
UNION ALL SELECT 292,785,358,DATE '2016-04-01' 
UNION ALL SELECT 293,786,826,DATE '2016-05-07' 
UNION ALL SELECT 293,787,835,DATE '2016-05-23' 
) 
-- end of input - start real query with WITH, 
-- not comma, here 
, 
interesting_payments AS (
SELECT 
    u.userid 
, MAX(paymentdate) AS paymentdate 
FROM tbl_user u 
LEFT JOIN tbl_payment USING(userid) 
GROUP BY u.userid 
) 
SELECT 
    u.userid 
, u.name 
, p.paymentid 
, p.amount 
, p.paymentdate 
FROM interesting_payments i 
JOIN tbl_user u USING(userid) 
LEFT JOIN tbl_payment p USING(userid,paymentdate) 
; 


userid|name  |paymentid|amount|paymentdate 
    292|John Smith |  785| 358|2016-04-01 
    293|Anna Bennet |  787| 835|2016-05-23 
    294|Mark Johnson|NULL  |NULL |NULL