如果已经提及,请提前抱歉。
我正在开发一个数据库,该数据库结构不是特别好,但它由第三方拥有,无法更改。
我需要一些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找到下一个后缀,然后使用这两个后缀值来限制我的记录集。它不起作用!!
我不能使用MAX(),因为2013年的交易已经添加到系统中,我会获得比实际需要更多的记录。
结果我应该期待这个例子的数据是:
ABCD1 300.00
非常感谢任何帮助。
要回答另一个问题,如果我选择2011作为我的年份来运行报告,那么2011年应该只有一个New Bus或Ren交易,所以如果它是一个New Bus交易,下一个主要交易将是一个Ren,如果它的一个人然后下一个主要交易将是一个人。再次在下面的例子中,如果我跑2011年,它应该从2011年6月1日找到Ren,所以我想要返回Ren和两个Adjust记录。
对不起,如果我有点模糊,我没有使用过这个论坛。
我使用的表有很多polrefs所以我需要这个代码来计算所有属于日期范围的polrefs的总数。一些polrefs可能只有一行,一个新总线,一些将有很多行,具体取决于整个政策年度进行了多少次调整
答案 0 :(得分: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
从那以后,它应该是微不足道的。只选择您在特定年份感兴趣的那些。但是你的问题在某些细节方面仍然含糊不清,所以我现在还没有进一步说明。