5

これがすでにカバーされている場合は、事前に申し訳ありません。

私は特によく構造化されていないデータベースに取り組んでいますが、それはサードパーティによって所有されており、変更することはできません。

テーブル内で次に出現する値を見つけ、その結果に基づいてレコードを返すには、t-sqlの支援が必要です。まずデータについて説明します。わかりやすくするために、これを簡略化しました。

Polref      Effective Date       Transaction Type     Suffix        Value
ABCD1       01/06/2010           New Bus              1             175.00
ABCD1       01/06/2011           Ren                  2             200.00
ABCD1       19/08/2011           Adjust               3              50.00
ABCD1       23/04/2012           Adjust               4              50.00
ABCD1       01/06/2012           Ren                  5             275.00

したがって、2011年のクエリを実行した場合、コードはこの例で接尾辞2、3、4の行を返す必要があります。したがって、私がやろうとしているのは、指定された年の新しいバスまたはRenの最初の接尾辞を見つけることです。次に、同じpolrefの新しいバスまたはRenの次のサフィックスを見つけ、それら2つのサフィックス値を使用してレコードセットを制限します。動作しません!!

2013年のトランザクションがすでにシステムに追加されているため、MAX()を使用できません。実際に必要な数よりも多くのレコードを取得することになります。

この例のデータに期待する結果は次のようになります。

ABCD1 300.00

どんな助けでも大歓迎です。

別の質問に答えるために、レポートを実行する年として2011を選択した場合、2011年の新しいバスまたはRenトランザクションは1つだけである必要があるため、新しいバストランザクションの場合、次のメイントランザクションはRenになります。次の主なトランザクションはRenになります。以下の例でも、2011年に実行すると、2011年1月6日からのRenが見つかるはずなので、そのRenと2つのAdjustレコードを返します。

申し訳ありませんが、私は以前にこのフォーラムを使用したことがないので、少し漠然としていた場合はお詫び申し上げます。

私が使用しているテーブルには多くのpolrefがあるため、日付範囲内にあるすべてのpolrefの合計を計算するには、このコードが必要です。一部のpolrefには、新しいバスという1つの行しかない場合があります。また、ポリシーの年間を通じて行われた調整の数に応じて、多くの行を持つものもあります。

4

1 に答える 1

2

部分的な答え:

このクエリ:

declare @t table (PolRef char(5) not null, EffectiveDate date not null,TransactionType varchar(10) not null,Suffix int not null,Value decimal(10,2) not null)
insert into @t (Polref,EffectiveDate,TransactionType,Suffix,Value) values
('ABCD1','20100601','New Bus',1,175.00),
('ABCD1','20110601','Ren',2,200.00),
('ABCD1','20110819','Adjust',3,50.00),
('ABCD1','20120423','Adjust',4,50.00),
('ABCD1','20120601','Ren',5,275.00)

;With StartTransactions as (
    select PolRef,Suffix,ROW_NUMBER() OVER (PARTITION BY PolRef ORDER BY Suffix) rn
    from @t where TransactionType in ('New Bus','Ren')
), Periods as (
    select st1.PolRef,st1.Suffix as StartSuffix,st2.Suffix as EndSuffix
    from
        StartTransactions st1
        left join
        StartTransactions st2
            on
                st1.PolRef = st2.PolRef and
                st1.rn = st2.rn - 1
)
select
    p.PolRef,t2.EffectiveDate,SUM(t.Value) as Total
from
    Periods p
        inner join
    @t t
        on
            p.PolRef = t.PolRef and
            p.StartSuffix <= t.Suffix and
            (p.EndSuffix > t.Suffix or
            p.EndSuffix is null)
        inner join
    @t t2
        on
            p.PolRef = t2.PolRef and
            t2.Suffix = p.StartSuffix
group by
    p.PolRef,t2.EffectiveDate

Ren連続する各トランザクションまたはNew Busトランザクションに基づいて、トランザクションの各セットをグループ化します。

PolRef EffectiveDate Total
------ ------------- ---------------------------------------
ABCD1  2010-06-01    175.00
ABCD1  2011-06-01    300.00
ABCD1  2012-06-01    275.00

そこから、特定の年から興味のあるものだけを選択するなど、簡単なことです。しかし、あなたの質問はいくつかの詳細についてはまだ漠然としているため、現時点ではこれ以上取り上げません。

于 2012-10-30T15:46:36.807 に答える