在单独的列中添加关键字段的历史数据(先前的合同)

时间:2019-04-15 12:40:13

标签: sql sql-server

我想计算客户在某些合同之间转换需要多少天。这可能会立即发生,也可能会花费很多天,我想过滤花费太长时间的案件。

目前,我有一个包含客户(AccountNum),合同(ContractId),他们居住的建筑物(d)在(RentalObjectId)中的数据集。一个AccountNum可以切换ContractId,而AccountNums可以在之前居住的另一个AccountNum的RentalObjectId中启动一个新的ContractId。因此数据如下所示:

CREATE TABLE PMCCONTRACT (
AccountNum nvarchar(20),
ContractId nvarchar(20),
RentalObjectId nvarchar(20),
ValidFrom date,
ValidTo date);

INSERT INTO PMCCONTRACT (AccountNum, ContractId, RentalObjectId, ValidFrom, ValidTo)
VALUES
('1','HC1','1','43101','43221'),
('2','HC2','2','43101','43252'),
('3','HC3','3','43466','NULL'),
('1','HC4','2','43222','NULL'),
('2','HC5','4','43261','43466'),
('4','HC6','5','43525','NULL');

这就是我想要的样子:

CREATE TABLE PMCCONTRACTFIX (
AccountNum nvarchar(20),
ContractId nvarchar(20),
RentalObjectId nvarchar(20),
ValidFrom date,
ValidTo date,
PreviousContract nvarchar(20),
PreviousContractValidTo date,
DaysBetweenContracts int);

INSERT INTO PMCCONTRACTFIX (AccountNum, ContractId, RentalObjectId, ValidFrom, ValidTo, PreviousContract, PreviousContractValidTo, DaysBetweenContracts)
VALUES
('1','HC1','1','43101','43221','NULL','NULL','NULL'),
('2','HC2','2','43101','43252','NULL','NULL','NULL'),
('3','HC3','3','43466','NULL','NULL','NULL','NULL'),
('1','HC4','2','43222','NULL','HC1','43221','1'),
('2','HC5','4','43261','43466','HC2','43252','9'),
('4','HC6','5','43525','NULL','NULL','NULL','NULL');

我不知道如何开始解决此问题。有人有建议吗?

亲切的问候, 伊戈尔(Igor)

2 个答案:

答案 0 :(得分:0)

您可以在PMCCONTRACTFIX上设置触发器并处理Previous列 该代码可以给您一些想法:

update p
set PreviousContract=P2.ContractId  , PreviousContractValidTo=p2.ValidTo,DaysBetweenContracts=(P2.ValidFrom-P2.ValidTo)
from PMCCONTRACTFIX P
               left join PMCCONTRACTFIX P2 on p.AccountNum=p2.AccountNum
               left join (select AccountNum,MAx(ContractId) ContractId from PMCCONTRACTFIX  Group by AccountNum ) X on X.ContractId = P2.ContractId 

但是请记住,您不能在触发后使用它

Select p. *,P2.ContractId  , p2.ValidTo,(P2.ValidFrom-P2.ValidTo)
from PMCCONTRACTFIX P
               left join PMCCONTRACTFIX P2 on p.AccountNum=p2.AccountNum
               left join (select AccountNum,MAx(ContractId) ContractId from PMCCONTRACTFIX  Group by AccountNum ) X on X.ContractId = P2.ContractId 

答案 1 :(得分:0)

如果帐户只能有一个有效合同,则可以采用传统的生效日期类型结构。

因此您的计划是累加和生效日期。如果有人换了合同,则您不会更新任何内容,而是在该生效日期前添加一行。

现在,如果您想返回任何日期的世界,您只需找到有效的记录,即表<=所需日期中的生效日期。

由于您还需要查看当前记录,因此创建一个视图以使用数据库当前日期功能过滤记录。

您甚至不需要日期。而是有一栏表示合同已终止。因此,您将添加一条记录,以指示合同终止的日期。如下创建表

table name = PMCCONTRACT

PK {AccountNum, ContractId, effdte [This is a date column]}
RentalContractId
enabled?

现在,您仅向表中添加行。你永远不会更新。每当您查找数据时,您都是在“从某个数据开始”查找数据,并且可以假定是从今天开始。因此,您要获取数据的sql将是:

input = checkEffDte, e.g. today, AccountNum, ContractId

select *
from PMCCONTRACT c1
where c1.AccountNum = :AccountNum
and c1.ContractId = :ContractId
and c1.effdte = ( select max(effdte)
                  from PMCCONTRACT c2
                  where c2.AccountNum = c1.AccountNum
                  and c2.ContractId = c1.ContractId
                  and c2.effdte <= :checkEffDte
                )

因此您可以查看在任何给定日期的rentalContract。您将在生效日期之前找到最大记录。

您也可以在上方查看一个视图-然后,您将可以快速查看所有记录。