我有表A和表B
**Table A**
Claim_ID PK
**Table B**
Claim_State_ID
Claim_ID FK
Claim State
Claim_State_Start_Date
Claim_State_End_Date
表A可以有很多表B
声明状态可以有三个值:已终止,已提交和已完成付款。
我是否可以对表A.Claim_ID进行选择,其中声明状态被终止,但之前的状态必须是付款完成。我会通过检查开始和结束日期来完成此操作。
基本上,我只需要选择状态终止的声明,但是在终止并且未提交之前的状态。
我目前没有数据,但这是我的合理尝试。
Select COUNT (Claim_ID) from TableA JOIN TableB On TableA.Claim_ID=TableB.Claim_ID Where TableB.Claim_State ="Terminated" and Claim_State_End_Date
由于我需要将日期与发送至付款状态的日期进行比较,因此此声明缩短了。
这甚至可能吗?
答案 0 :(得分:1)
原谅古老的连接语法。我更喜欢它,出于某种原因...
我认为你要求“找到所有声明显示已终止的声明,另一条记录显示已付款,终止日期大于付费日期。”
select a.claim_ID
from TableA a,
TableB term,
TableB paid
where a.claim_id = term.claim_id
and a.claim_id = paid.claim_id
and term.Claim State = 'TERMINATED'
and paid.Claim State = 'PAID'
and term.Claim_State_Start_Date >= paid.Claim_State_Start_Date
答案 1 :(得分:0)
除非您明确存储哪些声明已完成付款,否则无法进行此操作。您必须为此添加至少一个标志或一个全新的表。
答案 2 :(得分:0)
row_number和Common Table Expressions是你的朋友。
WITH cte AS
(
select
Claim_Id,
Claim_State,
Row_Number() over (Partition by Claim_Id order by Claim_State_Start_Date) as row
from
Table_B
)
select a.Claim_ID
from cte a inner join cte b on a.Claim_Id = b.Claim_Id and a.row = b.row + 1
where a.Claim_State = 'Terminated' and b.Claim_State = 'Paid';
这将检查紧接在前的状态为“付费”以使任何先前状态“付费”将查询更改为select distinct
并将行测试更改为a.row > b.row