none
如何取加上选择条件的上一期合同的 某个数据? RRS feed

  • 问题

  •     租金表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%'

     



      

      


    C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!

    2012年3月22日 12:01

全部回复

  • 
    

    ;with f as
    (
    select px=row_number()over(partition by city,road,address order by leasedateto desc),* from ta
    )
    select
     a.City+a.Road +a.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.px = 1


    More: blog.csdn.net/happyflystone


    2012年3月22日 14:56
  •     感谢您的解答,很抱歉这么晚才回帖!今天中午我才发现了原来是order by leasedateto desc 少了Desc。我想多问一点:

    --

        现在我已经Select到了我想要的结果,我现在要把a中的TypeOfPayment按b中的TypeOfPayment值更新,该怎么写呢???  

     

    一下是我现在在用的代码,select结果正常,但不知道怎么更新

    ;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%'
    

      

    C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!

    2012年3月26日 9:16