表t1中字段有 姓名,月份,工资tom   200605  1000
john  200605  2900
tom   200604  800
john  200604  3500
。现在要生成另一表t2   姓名,月份,工资涨降
结果应该象:john  200605 -600        (2900-3500)
tom   200605  200
。。
--------------------------------
请问大虾们,这个语句该怎么写啊?

解决方案 »

  1.   

    create table #t(姓名 varchar(100), 月份 int, 工资 int)
    insert into #t
    select 'tom',200605,1000 union all
    select 'john',200605,2900 union all
    select 'tom',200604,800 union all
    select 'john',200604,3500
    select 
          姓名,
          月份,
          工资-(select top 1 工资 from #t where 姓名=a.姓名 and 月份<a.月份) as 工资涨降,
          '(' + cast(工资 as varchar(100)) + '-' + (select top 1 cast(工资 as varchar(100)) from #t where 姓名=a.姓名 and 月份<a.月份) + ')' as 计算过程
    from #t a
    where 月份=200605
    drop table #t/*
    姓名       月份          工资涨降    计算过程
    ------------------------------------------------------------
    tom        200605        200        (1000-800)
    john       200605        -600       (2900-3500)*/
      

  2.   

    是不是将
    select top 1 工资 from #t where 姓名=a.姓名 and 月份<a.月份
    改为
    select top 1 工资 from #t where 姓名=a.姓名 and 月份<a.月份 order by 月份 desc 
    好一点。
      

  3.   

    --yescreate table #t(姓名 varchar(100), 月份 int, 工资 int)
    insert into #t
    select 'tom',200605,1000 union all
    select 'john',200605,2900 union all
    select 'tom',200604,800 union all
    select 'john',200604,3500
    select 
          姓名,
          月份,
          工资-(select top 1 工资 from #t where 姓名=a.姓名 and 月份<a.月份 order by 月份 desc) as 工资涨降,
          '(' + cast(工资 as varchar(100)) + '-' + (select top 1 cast(工资 as varchar(100)) from #t where 姓名=a.姓名 and 月份<a.月份 order by 月份 ) + ')' as 计算过程
    from #t a
    where 月份=200605
    drop table #t/*
    姓名       月份          工资涨降    计算过程
    ------------------------------------------------------------
    tom        200605        200        (1000-800)
    john       200605        -600       (2900-3500)*/
      
      

  4.   

    --测试环境
    declare @t table(姓名 varchar(10),月份 int ,工资 money)
    insert into @t select 'tom',200605,1000
    union all select 'john',200605,2900
    union all select 'tom',200604,800
    union all select 'john',200604,3500;--查询WITH CTE_T1(姓名,月份,工资)
    AS
    (
    SELECT  * FROM @t A
    WHERE NOT EXISTS (SELECT 1 FROM @T WHERE 姓名=A.姓名 AND 月份>A.月份)
    ),
    CTE_T2(姓名,月份,工资)
    AS
    (
    SELECT  * FROM @t A
    WHERE NOT EXISTS (SELECT 1 FROM @T WHERE 姓名=A.姓名 AND 月份=A.月份-1)
    )
    select 姓名=a.姓名,月份=a.月份,工资涨降=a.工资-b.工资 from CTE_T1 a ,CTE_T2 b
    where a.姓名=b.姓名
    /*
    结果
    姓名         月份          工资涨降
    ---------- ----------- ---------------------
    tom        200605      200.00
    john       200605      -600.00(2 行受影响)
    */
      

  5.   

    这个可以在某人月份不连续的情况下也能算出工资之间的差额
    select a.姓名,a.月份,(a.工资-(select top 1 工资 from @t  where a.姓名=姓名 and a.月份>月份 order by 工资))as 工资涨降,('('+cast(a.工资 as varchar(100))+'-'+cast((select top 1 工资 from @t where a.姓名=姓名 and a.月份>月份 order by 工资)
     as varchar(100))+')') as 计算过程 from @t a where a.月份=200605
      

  6.   

    谢谢大家。
    大家可能都有工资条吧。
    工资条上肯定有很多项,我这有24项。我要建立每个人(考虑某月新人加入)每个月每项的变化,你们说我的sql语句该有多长啊?我不需要“计算过程”列。
    因此,恳请大家帮我出出主意。
      

  7.   

    看看这个是不是你想要的,改变月份存放方式,日期1753-1-1开始的,效率很高create table #t
    (姓名 varchar(10), 
    月份 int, 
    工资 int)insert into #t
    select 'tom',DATEDIFF(mm,'1753-1-1','2005-1-1'),1000 union all
    select 'tom',DATEDIFF(mm,'1753-1-1','2005-2-1'),1100 union all
    select 'tom',DATEDIFF(mm,'1753-1-1','2005-3-1'),1300 union all
    select 'tom',DATEDIFF(mm,'1753-1-1','2005-4-1'),1700 union all
    select 'join',DATEDIFF(mm,'1753-1-1','2005-1-1'),1000 union all
    select 'join',DATEDIFF(mm,'1753-1-1','2005-2-1'),800 union all
    select 'join',DATEDIFF(mm,'1753-1-1','2005-3-1'),1200 union all
    select 'join',DATEDIFF(mm,'1753-1-1','2005-4-1'),1700 
    select 
    a.姓名,
    DATENAME(yy,DATEADD(mm,a.月份,'1753-1-1'))+DATENAME(mm,DATEADD(mm,a.月份,'1753-1-1')) 月份1,
    DATENAME(yy,DATEADD(mm,b.月份,'1753-1-1'))+DATENAME(mm,DATEADD(mm,b.月份,'1753-1-1')) 月份1,
    b.工资 - a.工资 工资涨降,
    '('+cast (a.工资 as nvarchar(100)) + '-' +cast (b.工资 as nvarchar(100))+')' 计算过程
    from #t a 
    inner join #t b ON a.姓名 = b.姓名 and a.月份 = b.月份-1
    order by a.姓名,a.月份 desc
    drop table #t姓名         月份1        月份1        工资涨降        计算过程          
    ---------- ---------- ---------- ----------- ------------- 
    join       200503     200504     500         (1200-1700)
    join       200502     200503     400         (800-1200)
    join       200501     200502     -200        (1000-800)
    tom        200503     200504     400         (1300-1700)
    tom        200502     200503     200         (1100-1300)
    tom        200501     200502     100         (1000-1100)
      

  8.   

    还是把我的整体想法说出来吧。我的目的是将带有24个字段的工资条的工资总表,显示到datagridview中,同时,将每个人每个月的记录的每个字段的值与其相应的上个月的值比较,涨降用红蓝两色标出,如果没有上月记录,则不比较。大家给点方案也行。再次谢谢大家。一定给分。
      

  9.   

    这样就是每个月于上个月的比较嘛,上面的算法应该有可以得到结果的了
    再根据结果判断是正值还是负值,而使用不同颜色的brush填写此项
      

  10.   

    create table #t(姓名 varchar(100), 月份 int, 工资 int)
    insert into #t
    select 'tom',200605,1000 union all
    select 'john',200605,2900 union all
    select 'tom',200604,800 union all
    select 'john',200604,3500
    select 
          姓名,
          月份,
          工资-(select top 1 工资 from #t where 姓名=a.姓名 and 月份<a.月份) as 工资涨降,
          '(' + cast(工资 as varchar(100)) + '-' + (select top 1 cast(工资 as varchar(100)) from #t where 姓名=a.姓名 and 月份<a.月份) + ')' as 计算过程
    from #t a
    where 月份=200605
      

  11.   

    create table t(name varchar(10),
    yuefen varchar(10),
    gz int 
    )insert t select 'tom','200506',3000
    insert t select 'john','200505',2500
    insert t select 'tom','200505',2800
    insert t select 'john','200506',3200
    select 
    a1.name,a1.yuefen,a2.yuefen,(a1.gz-a2.gz) 升降 
    from 
    t a1 
    join
    t a2
    on 
    a1.gz>=a2.gz
    and 
    a1.name=a2.name
    where 
    (a1.gz-a2.gz)>0
      

  12.   

    请大虾们注意,我的字段很多,如果照大家的写法,sql语句该多长啊?