我想计算客户在某些合同之间转换需要多少天。这可能会立即发生,也可能会花费很多天,我想过滤花费太长时间的案件。
目前,我有一个包含客户(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)
答案 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。您将在生效日期之前找到最大记录。
您也可以在上方查看一个视图-然后,您将可以快速查看所有记录。