1

すべての個別の AccountId と、それぞれの最も早い InsertDate を取得しようとしています。AccountId がわからない場合があり、トランザクションが異なる場合がありますが、すべての「-1」を独自のグループにまとめたいと考えています。

これは、スキーマとともにこれまでに試みたものです。

    CREATE TABLE #tmpResults (
        Trans Varchar(12),                              
    AccountId Varchar(50),                          
EarlyDate DateTime DEFAULT getdate(),                                                                               CardType Varchar(16))

insert #tmpResults
        select [Trans]                              = convert(varchar(12),'CashSale')
        ,   [AccountId]                             = b.AccountId
        ,   [EarlyDate]                             = min(b.InsertDate)
        ,   case when c.name LIKE '%VISA%'      then 'VISA'
                    when c.name LIKE '%MasterCard%' then 'MasterCard'
                    when c.name LIKE '%AMEX%'       then 'AMEX'
                    else 'Other'
            end as [CardType] 
        from TransBatch b
        left join CardVer_3 c WITH (NOLOCK) ON c.Id = B.BatchId
        left join TransBatch b2
        on (b.accountid = b2.accountid and (b.InsertDate > b2.InsertDate or b.InsertDate = b2.InsertDate))
        and b2.accountid is NULL
        group by b.accountid, b.InsertDate,c.name       
        order by b.accountid DESC

        select * from  #tmpResults

テーブル スキーマは次のようになります。

**TransBatch**  
RecordId    |BatchId    |InsertDate     | AccountId     | AccNameHolder  
6676    |   11  |   2012-11-01 05:19:04.000 |   12345   |   Account1  
6677    |   11  |   2012-11-01 05:19:04.000 |   12345   |   Account1  
6678    |   11  |   2012-11-01 05:19:04.000 |   55555   |   Account2  
6679    |   11  |   2012-11-01 05:19:04.000 |   -1  |   NULL  
6680    |   12  |   2012-11-02 05:20:04.000 |   12345   |   Account1  
6681    |   12  |   2012-11-02 05:20:04.000 |   55555   |   Account2  
6682    |   13  |   2012-11-04 06:20:04.000 |   44444   |   Account3  
6683    |   14  |   2012-11-05 05:30:04.000 |   44444   |   Account3  
6684    |   14  |   2012-11-05 05:31:04.000 |   -1  |   NULL  


**CardVer_3**  
BatchId     |Name  
11      |MasterCard  
12      |Visa  
13      |AMEX   
14      |GoCard

これは中間テーブルになり、出力は添付のようになる予定です。

最小年齢 (今日からの日付) でグループ化されたカードタイプごとの個別のアカウント数

4

2 に答える 2

0

最小挿入日時の完全なレコードを取得しようとしているようです。このために、あなたはウィンドウズ関数を使いたいです:

select 'CashSale' as Trans,
       AccountId,
       min(InsertDate),
       (case when name LIKE '%VISA%'      then 'VISA'
             when name LIKE '%MasterCard%' then 'MasterCard'
             when name LIKE '%AMEX%'       then 'AMEX'
             else 'Other'
        end) as [CardType] 
from (select AccountId, InsertDate, c.name,
             row_number() over (partition by AccountId order by insertDate desc) as seqnum
      from TransBatch b left join
           CardVer_3 c WITH (NOLOCK)
           ON c.Id = B.BatchId
     ) t
where seqnum = 1

「CashSale」はクレジットカードが一致しなかったことを意味していると推測しています。その場合、TransIdはrecordIdまたは「CashSale」のいずれかになります。

于 2012-11-20T14:21:40.040 に答える
0

ゴードン、私はあなたの提案にいくつかの非常に小さな変更を加え、正しい出力があると信じています: http://www.sqlfiddle.com/#!3/cfbc3/7/0。どうもありがとうございました。私はWindowsの機能にまったく慣れていないので、これらをブラッシュアップします。

コードは次のとおりです。
select 'CashSale' as [Trans],
AccountId,
min(InsertDateTime),
(case when name LIKE '%VISA%' then 'VISA'
when name LIKE '%MasterCard%' then 'MasterCard'
when name LIKE '%AMEX%' then 'AMEX'
else 'Other'
end) as [CardType]
from (select AccountId, InsertDateTime, c.name,
row_number() over (partition by AccountId order by insertDateTime asc) as seqnum
from TransBatch b left join
CardVer_3 c WITH (NOLOCK) ON c.batchId = B.BatchId
) t
where seqnum = 1
group by t.accountid, t.name

次のステップは、これを一時テーブルにダンプし、添付の Excel 画面のような出力を取得することです。

于 2012-11-20T23:47:34.400 に答える