2017-09-11 8 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] 

いくつかのアカウントがEVER、支払ったことがない、ので、このコードは動作しません。したがって、一部のアカウントには、そのフィールドには「PYMNT」コードがまったくありません。それらのフィールドには他のコードがありますが、そのフィールドにはPYMNTコードはありません。したがって、そのAcctIDのコードを実行すると、ヘッダと結果だけが得られます。

そのAcctIDのフィールドに「Never Paid」と表示されるので、別の結果テーブルに参加できますか?

私は最終的に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 |であったサンプルデータには、 'Never Paid'という値が表示されるのはなぜですか? –

+0

あなたのクエリは、1つのテーブルのタプルのみで構成されています。これは、トランザクションが含まれていると仮定しているため、決して支払わなかったアカウントの行は含まれません。 'from finacct left join fintransmaster using(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

をするだけselectwhereから条件を移動:

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

T誰かが支払っていない場合、彼はNULLに値を設定します。文字列が必要な場合は、日付を文字列に変換して、型に互換性があるようにする必要があります。

関連する問題