-1

我有表 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

Claim State 可以有三个值:Terminated、Submitted 和 Payment Complete。

我是否可以在表 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

该声明在此处被缩短,因为我需要将日期与发送到付款状态的日期进行比较。

这甚至可能吗?

4

3 回答 3

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
于 2013-01-14T11:29:10.713 回答
0

除非您明确存储索赔已完成付款的某处,否则这是不可能的。为此,您必须至少添加一个标志或一个全新的表。

于 2013-01-14T11:24:39.700 回答
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

于 2013-01-14T13:24:49.947 回答