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 的行。所以我一直在尝试做的是找到指定年份的 New Bus 或 Ren 的第一个后缀然后为同一个 polref 找到新总线或 Ren 的下一个后缀,然后使用这两个后缀值来限制我的记录集。它不起作用!

我不能使用 MAX(),因为 2013 年的交易已经添加到系统中,这样我会得到比我实际需要的更多的记录。

我应该期待这个示例数据的结果是:

ABCD1 300.00

任何帮助将不胜感激。

回答另一个问题,如果我选择 2011 作为我运行报告的年份,那么 2011 年应该只有一个 New Bus 或 Ren 交易,所以如果它是 New Bus 交易,下一个主要交易将是 Ren,如果它是 Ren那么下一个主要交易将是 Ren。同样在下面的示例中,如果我运行 2011 年,它应该找到 01/06/2011 的 Ren,所以我想返回 Ren 和两条 Adjust 记录。

抱歉,我之前没有使用过这个论坛,如果我有点含糊,请见谅。

我使用的表有很多 polref,所以我需要这段代码来计算日期范围内所有 polref 的总数。有些 polrefs 可能只有一排,一辆新巴士,有些会有很多排,具体取决于政策全年进行了多少次调整

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 回答