针对不同列

时间:2016-06-06 17:57:49

标签: sql sql-server sql-server-2008 tsql iteration

下面我有以下表结构:

CREATE TABLE StandardTable
    (
     RecordId varchar(50),
     Balance float,
     Payment float,
     ProcDate date,
     RecordIdCreationDate date,
     -- multiple other columns used for calculations
   )

以下是我的数据可能类似的小样本:

RecordId    Balance    Payment    ProcDate    RecordIdCreationDate
1           1000       100        2005-01-01  2005-01-01
2           5000       250        2008-01-01  2008-01-01
3           7500       350        2006-06-01  2006-06-01

1           900        100        2005-02-01  NULL
2           4750       250        2008-02-01  NULL
3           7150       350        2006-07-01  NULL

该表以事务为基础保存数据,并且其中包含数百万行。 ProcDate字段指示正在处理每个事务的月份。无论交易何时在整个月内发生,ProcDate字段都硬编码到交易发生的月份的第一个月。因此,如果交易发生在2009-01-17,则ProcDate字段将为2009-01-01 。我处理历史数据,可以追溯到2005-01-01。表中的每个RecordId都有多个实例。 RecordId将在每个月出现,直到Balance列达到0.有些RecordId来源于数据开始的月份(ProcDate为2005-01-01),而其他人不会发送到日期。 。 RecordIdCreationDate字段表示RecordId的发起日期。因此该行在表中有数百万个NULL值,因为每个RecordId没有发起的每个月都等于NULL。

我需要以某种方式查看每个RecordId,并逐个月地运行许多不同的计算。我的意思是我必须比较每个RecordId的列值,其中ProcDate可能类似于2008-01-01,并将这些值与ProcDate为2008-02-01的相同列值进行比较。然后,当我在那个月运行RecordId的计算后,我必须将2008-02-01的值与2008-03-01的值进行比较,然后再次运行我的计算,等等。我认为我可以做这一切都在一个大的WHILE循环中,但我不完全确定它会是什么样子。

我做的第一件事就是在我的数据库中创建另一个表,它与我的StandardTable具有相同的表设计,我称之为ProcTable。在那个ProcTable中,我插入了RecordIdCreationDate不等于NULL的所有数据。这给了我数据库中每个RecordId的第一个实例。我能够成功地运行第一个月的计算,但是我在努力的方法是如何使用ProcTable中的列值,并将这些值与ProcDate之后的月份的列值进行比较。即使我能以某种方式做到这一点,我也不确定如何重复这个过程来将第二个月的数据与第三个月的数据以及第三个月的数据进行比较到第4个月的数据等

有什么建议吗?提前谢谢。

1 个答案:

答案 0 :(得分:0)

对我来说,你需要做的就是在这种情况下将表格加入到自身

ON MyTable1.RecordId = MyTable2.RecordId    
AND MyTable1.ProcDate = DATEADD(month, -1, MyTable2.ProcDate)

然后你将拥有表中的所有行(MyTable1),从下个月(MyTable2)加入到同一个RecordId行。

在每一行中,您可以在两个连接表之间进行任何计算。