2016-08-11 52 views
1

現在,經過這麼多小時試圖弄清楚,我現在真的需要幫助。使用帶有或不帶空值的日期值的最大值

我有一張表,其中包含數以百萬計約50,000個客戶的記錄。每個客戶至少有2000個交易。

我想擁有一張表,其中包含每個客戶在網站上購買或出售商品的最新日期。

我已經試過

'FOR PURCHASES 
Update tblmycustomers 
set LastBoughtdate = (Select ISNULL(Max(trndate), '01-Jan-1900') from tbltransactions where Type = 'PURCHASES') 
from tbltransactions.AccountRef = tblmycustomers.AccountNo 

它正常工作,對於具有「購物」的記錄,但對於那些誰不擁有商品購進,這樣可以節省另一日期這是不對的

我希望它返回默認日期(「1900年1月1日」),對於沒有購買的每個客戶,並且返回那些擁有的最大交易日期。

請幫幫我。

+0

你的第一個問題是在你的用例中使用update語句。查詢結果將是一樣的,但沒有理論頭痛 –

回答

3

試試這個:

UPDATE c 
SET LastBoughtdate = ISNULL(Q.MaxBoughtDate, '1900-01-01') 
FROM tblmycustomers c 
    LEFT JOIN 
    (SELECT AccountRef, MAX(trndate) AS MaxBoughtDate 
    FROM tblTransactions 
    WHERE Type = 'PURCHASES' 
    GROUP BY AccountRef) Q ON Q.AccountRef = AccountNo 
+0

天堂之門!完美!準確地告訴我我花了將近一天的時間。 非常感謝!你讓我的一天舉手。 – DoreenSly

3

我相信這會奏效。駕駛員表是「客戶」,您想要加入到交易中......即使沒有交易,您也可以獲得所有客戶記錄。所以...做這樣的事情:)

Select cust.AccountNo 
    ,  isnull(max(trans.trndate), convert(date,'01/01/1900')) as LastBoughtDate 
    from tblmycustomers as cust 
    left join tbltransactions as trans on cust.AccountNo = trans.AccountRef 
    where type = 'PURCHASES' 
    group by cust.AccountNo 
+0

這將跳過更新所有帳戶沒有任何購買。如果您指定'where type = purchase',那麼'left join'與'inner join'相同。 – Anton

+0

good點....我有一個編輯,但我喜歡你的答案....幾乎是我的意圖:) – JBizz

2

這個更新基於帳號的左外連接子查詢的最大轉換。

UPDATE 
    T 
SET 
    T.LastBoughtdate=COALESCE(A.LastPurchaseDate,'01/01/1900') 
FROM 
    tblmycustomers T 
LEFT OUTER JOIN 
(
    SELECT 
     T2.AccountRef 
     LastPurchaseDate=MAX(trndate) 
    FROM 
     tbltransactions T2 
    WHERE 
     T2.Type='PURCHASES' 
    GROUP BY 
     T2.AccountRef 
)AS A ON A.AccountRef=T.AccountNo 
+0

這將跳過更新所有帳戶沒有任何購買,因爲子查詢只包含購買行 – Anton

+1

一個新的版本會錯過ISNULL(),否則LastBoughtDate對於沒有購買的所有賬戶都是NULL。最後它會和我的回答中的代碼幾乎相同:) COALESCE可能不是必需的作爲trndate的紅色可能不能爲NULL。如果交易的交易日期爲空,這是一個錯誤。 – Anton

+0

我有一個INNER JOIN,在黑客查詢後不會工作。但是,在我修好之後,我仍然沒有把你的關於「錯過ISNULL()在上面」的一部分。問題的關鍵在於「LastUpdated」應該是最短日期,或者如果爲null,則爲其他值。那不是什麼? –

1

如果你的 「LastBoughtdate」 是日期時間。我想你需要轉換「01-01-1900」。轉換(日期,'01 - 01-1900',101)。

相關問題