租金表ContractTable,有7个字段,分别是:ContractNumber(合同号,主键,nvarchar)、City(所在城市,nvarchar),Road(所在路段,nvarchar),Address(门牌号,nvarchar),LeaseDateFrom(合同起始日,date),LeaseDateTo(合同终止日,date),MonthRent(月租金,decimal).-    City、Road、Address是联合使用的。-    现在把同一个City+Road+Address的值作为一个门店的完整地址,因为每隔一段时间这个门店会重新签合同,租金也会相应变化。-    问题:我想求同一个门店现在的月租金(MonthRent)和上一次合同的月租金的差和比例该怎么求?(上一期的合同应该可以根据LeastDateFrom(合同起始日)来推断)例如:本期月租金为MonthRent2,上期月租金为MonthRent1,我要求它们的差,即:MonthRent2-MonthRent1;求他们的比例,即:(MonthRent2/MonthRent1)-1-    有两点要注意的地方:1.同一个门店可能对应很多期的合同,我只是求最近的和上一期合同的差、比例。    2.并不是单独的求差和比例,肯定是要把这些数据和其他数据放在一起的,那么其他数据该注意什么?    3.显示的结果有两种情况,一种是把本期和上期的合同都显示出来;另一种是只显示本期合同,及本期合同和上期合同数据对比的结果,分别该怎么写呢???     请大家帮忙看看!谢谢各位!

解决方案 »

  1.   

    ;with cte as(
    select rn=row_number()over(partition by city,road,address order by 合同日期),* from contracttable
    )select a.*,a.月租金-b.月租金 as 租金差,(a.月租金-b.月租金)*1./b.月租金 as 比例
    from cte a left join cte b on a.city=b.city and a.road=b.road and a.address=b.address and a.rn=b.rn+1如果 city,road,address 总变的话,应该对门店编号,以编号为主键,这样,不管地址怎么变都不要紧.
      

  2.   

    ;with f as
    (
    select px=row_number()over(partition by city,road,address order by 合同日期),* from contracttable
    )
    select
     b.*,isnull(b.月租金,0)-isnull(a.月租金,0) as 租金差,
    (b.月租金-a.月租金)*1.0/a.月租金 as 比例
    from
     f a 
    left join
     f b on a.city=b.city 
    and
     a.road=b.road and a.address=b.address and a.px=b.px-1
      

  3.   

    其实你完全可以加一个自增列 这样的话就可以不用CTE了
      

  4.   

    感谢各位的及时回复!
        先问个问题!
    ;with 是什么意思?
        我是初学者!
      

  5.   


    2005的语法 如果是2000的话 插入临时表用
    select px=identity(int,1,1),* into #t from  contracttableselect
     b.*,isnull(b.月租金,0)-isnull(a.月租金,0) as 租金差,
    (b.月租金-a.月租金)*1.0/a.月租金 as 比例
    from
     #t a 
    left join
     #t b on a.city=b.city 
    and
     a.road=b.road and a.address=b.address and a.px=b.px-1
      

  6.   

    那可以用 WITH这个是里面的公用表达式 你可以去 查查用法
      

  7.   

    不好意思刚没仔细看楼主的需求,正如4楼小F所说,你加个字段,每个门店合同序号,到时候找到最大的,然后和-1相比较就可以了,即简单,维护起来也容易。
    换句话说,就是增加一个新字段:合同ID INT,然后将City、Road、Address和合同ID4个字段组成联合关键字即可。
    不过从数据表的范式来说,还是一张门店表,一张合同表更好些。
      

  8.   


    下午测试了一下,我的代码如下图,出现的问题是:
        1.如果某个门店对应了几个合同(也就是一个当前合同和几个过期合同),就运行正常。但是,某个门店如果只有一个合同相对应,那就会出现大片大片的‘NULL’,要如何解决这种问题呢?我需要的是即使这个门店只有一个合同,也应该把它对应唯一的合同信息显示出来,该怎么写呢?

        2.这个只是ContractTable(合同表),实际上经常要联合其他表一起使用,例如PropertyTable(资产表),假如我要把PropertyTable中的BuildingArea(面积)加进来该怎么写呢?PropertyTable和ContractTable都包含了City、Road、Address这三个字段,并且利用这三个字段相加后的值做成外键关系。
      

  9.   

    I:\问题\求差求比例Null01.JPG