这在SQL中可行吗?

时间:2013-01-14 11:21:42

标签: sql date

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

由于我需要将日期与发送至付款状态的日期进行比较,因此此声明缩短了。

这甚至可能吗?

3 个答案:

答案 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