租金表ContractTable,有7个字段,分别是:ContractNumber(合同号,主键,nvarchar)、City(所在城市,nvarchar),Road(所在路段,nvarchar),Address(门牌号,nvarchar),LeaseDateFrom(合同起始日,date),LeaseDateTo(合同终止日,date),TypeOfPayment(缴款方式,nvarchar)
-
    City、Road、Address是联合使用的,用来确定具体的地址。
-
    现在把同一个City+Road+Address的联合值作为一个门店的完整地址,因为每隔一段时间这个门店会重新签合同,TypeOfPayment(缴款方式)也可能变化。
-
    问题:我想求同一个门店现在的上一期的TypeOfPayment该怎么求?(上一期的合同应该可以根据LeastDateTo(合同终止日)的先后来推断)    有1点要注意的地方:1.同一个门店可能对应很多期的合同,我只是求门面上期合同的TypeOfPayment。以下是我写的代码,后面还有我遇到的新问题。
;with f as
(
select px=row_number()over(partition by city,road,address order by leasedateto),* from contracttable 
)
select
 b.City+b.Road +b.Address as 地址 ,a.typeofpayment ,b.TypeOfPayment from
 f a 
left join
 f b on a.City+a.Road +a.Address=b.City+b.Road +b.Address  and a.px=b.px-1
 开始这段代码我没发现什么问题,但是随着合同不断的签订,我的代码得到的是所有合同的上一期TypeofPayment,而不是我要的所有门面的上一期合同(比如:我有500个门面,每个门面都续签了一期的合同,因此有1000份合同,我的代码给出1000个结果,而不是500个,这就脱离了我的本意)。-----   另外,我如果只想搜索满足某个条件的门面的上一期合同的TypeOfPayment,又该怎么写呢?我尝试给前面的代码增加选择条件,结果是 “b.City+b.Road +b.Address as 地址” 这一段是空白,不知道该如何修改。请大家帮忙看看。下面是添加了选择条件的代码  
;with f as
(
select px=row_number()over(partition by city,road,address order by leasedateto),* from contracttable 
)
select
 b.City+b.Road +b.Address as 地址 ,a.typeofpayment ,b.TypeOfPayment from
 f a 
left join
 f b on a.City+a.Road +a.Address=b.City+b.Road +b.Address  and a.px=b.px-1
  where  a.ContractNumber like '%new%' and a.ContractNumber like '%20122%'

解决方案 »

  1.   

    ;with f as
    (
    select px=row_number()over(partition by city,road,address order by leasedateto),* from contracttable 
    )
    select
     b.City+b.Road +b.Address as 地址 ,a.typeofpayment ,b.TypeOfPayment from
     f a 
    left join
     f b on a.City+a.Road +a.Address=b.City+b.Road +b.Address  and a.px=b.px-1-----------在a上加个条件,就是只得到当前(最后一期)的合同。
      

  2.   


    ;with f as
    (
    select px=row_number()over(partition by city,road,address order by leasedateto desc),
    * from contracttable 
    )
    select City+Road +Address as 地址 ,typeofpayment ,TypeOfPayment 
    from f where px=2
      

  3.   

        下面是 能得到正确结果的代码,其实就是在Order by 后面加上 desc ,感谢 TravyLee 的提示。但我有个新问题,如何把符合条件where  a.ContractNumber like '%new%' and a.ContractNumber like '%20122%'的 a表中的TypeOfPayment更新成b表中相对应的TypeOfPayment呢?
    ;with f as
    (
    select px=row_number()over(partition by city,road,address order by leasedateto desc),* from contracttable 
    )
    select
     b.City+b.Road +b.Address as 地址 ,a.typeofpayment ,b.TypeOfPayment from
     f a 
    left join
     f b on a.City+a.Road +a.Address=b.City+b.Road +b.Address  and a.px=b.px-1
      where  a.ContractNumber like '%new%' and a.ContractNumber like '%20122%'
      

  4.   

    update 你要更新的表 set 字段 =新值所在表的字段 from 新值所在字段所在的表 where 关联条件(也就是需要把更新数据所在的表的标示字段等于被更新表的标示字段)
    由于你的结果时查询得到的,所以你把查询语句放到:with name as(查询语句)更新语句,只不过from后面的表名字时with后面的名字
      

  5.   

    用With 来更新的这种语句真没写过,能否请您帮忙完整的写出来,我能依葫芦画瓢。谢谢!