2017-09-11 20 views
0

我有一個表格,用於保存每個帳戶的金融交易數據。如何獲取SQL Server中沒有值的行?

**FinTransMaster table:** 
------------------------------------ 
|AcctID |FinTrnsCode|BusinessDay | 
------------------------------------ 
|1234567 |INTRST  |2017-09-09 | 
------------------------------------ 
|1234567 |CHARGE  |2017-09-08 | 
------------------------------------ 
|1234567 |PYMNT  |2017-09-01 | 
------------------------------------ 
|1234567 |INTRST  |2017-08-19 | 
------------------------------------ 
|1234567 |INTRST  |2017-08-09 | 
------------------------------------ 
|1234567 |CHARGE  |2017-08-04 | 
------------------------------------ 
|1234567 |PYMNT  |2017-08-01 | 
------------------------------------ 
|1234567 |INTRST  |2017-07-19 | 
------------------------------------ 

我想選擇上次每個帳戶的付款時間。

所以我的代碼如下:

SELECT AcctID 
     ,[FinTransCode] 
     --,MAX([BusinessDay]) --Tried this line, doesn't work 
     --,ISNULL(MAX([BusinessDay]), 'Never Paid') Last_Paid --Tried this line too, doesn't work 
     ,CASE WHEN ISNULL(MAX([BusinessDay]), 0) = 0 THEN 'Never Paid' 
      ELSE MAX([BusinessDay]) 
     END Last_Paid 

    FROM [GEB_DWH].[dbo].[FinTransMaster] 

    WHERE AcctID = '1234567' 
    AND FinTransTypeCode = 'PYMT' 

    GROUP BY AcctID,[FinTransTypeCode] 

此代碼不起作用,因爲,一些賬戶從來沒有支付,直到永遠。因此,有些帳戶在該領域根本沒有「PYMNT」代碼。他們有該領域的其他代碼,但該領域沒有PYMNT代碼。所以,當我爲該AcctID運行該代碼時,我只能得到標題和NO結果。

如何在該字段中爲該AcctID顯示'從未付費',以便我可以將其與另一個結果表一起加入?

什麼我最終想要得到的,通過與AcctID加入:

----------------------------------------------------------------- 
|AcctID |ContactName|Phone Number |Email Address |Last Payment | 
----------------------------------------------------------------- 
|1234567 |John Doe |123-123-1234 |[email protected] |Never Paid | 
----------------------------------------------------------------- 
+0

爲什麼您的樣本數據的值爲'從未付款',其中最後一筆付款是| 1234567 | PYMNT | 2017-09-01 |? –

+0

您的查詢只包含來自一個表的元組,因此我假設其中只包含交易,因此它不能包含任何未付款的行。你可能希望'從finacct左加入fintransmaster使用(acctid)'(如果你的帳戶表稱爲finacct) – Jakumi

回答

0

請嘗試以下:

--Summary Stats by transaction type 
    SELECT 
    AcctID, 
    FinTrnsCode, 
    lastActivityDt = max(BusinessDay) 
    into #temp 
    FROM FinTransMaster 
    group by AcctID,FinTrnsCode 

    --Find out all customers with Pmts 
    SELECT 
    distinct 
    ACCTID, 
    LastPmtDate = LastActivityDt 
    into #temp2 
    FROM #temp where FinTrnsCode = 'PYMNT' 

    SELECT ACCTID, 
    LastPmtDate = cast(LastPmtDate as varchar(50)) FROM #temp2 
    union 
    --Get all customers with no pmt records 
    SELECT distinct ACCTID, 'Never Paid' FROM #Temp where ACCTID not in (SELECT distinct ACCTID FROM #temp2) 
0

只需推動有條件從whereselect

SELECT AcctID, 
     MAX(CASE WHEN FinTransCode = 'PYMT' THEN BusinessDay END) as LastPayment 
FROM [GEB_DWH].[dbo].[FinTransMaster] 
GROUP BY AcctID; 

T如果有人沒有付款,他的價值爲NULL。如果你想要一個字符串,你需要將日期轉換爲一個字符串,因此這些類型是兼容的。

相關問題