有一个表,结构如下:
编号,姓名,时间,基本工资,奖金,扣款
1     张三  8-20    1000    1000   5
2     李四  8-20    1100    900    10
3     张三  9-20    900     1000   10
4     李四  9-20    1100    900    13
5     王五  9-20    900     100    0
如果我对8-20  和  9-20  的基本工资做异动数据查询 我要求得到这样的一个临时数据视图编号,姓名,基本工资   备注
1     张三  -100    
2     王五  900        新增
我以前是通过前台程序一个一个数据比对,但是发现这太慢了。大侠们看看能否在数据库底层直接用
sql语句实现呢?
谢谢

解决方案 »

  1.   

    select rownum 编号,姓名,基本工资,备注 from(
    select a.姓名,a.基本工资-nvl(b.基本工资,0) 基本工资,
      case when b.基本工资 is null then '新增' end 备注
    from tt a left join tt b
    on a.姓名=b.姓名
    where a.时间='9-20' and b.时间='8-20')
    where 基本工资<>0
      

  2.   

    select rownum id,name,salary, from(
    select a.id,a.name,a.salary-nvl(b.salary,0)salary,
      case when b.name is null then '新增' end 
      from (select * from tt where date1='9-20') a 
      left join (select * from tt where date1='8-20') b 
      on a.name=b.name)
    where salary<>0  
      

  3.   

    with temp as
    (select '张三' name, '8-20' date1,  1000 a1,   1000 a2,  5 a3 from dual
    union all
    select '李四' name, '8-20' date1,  1100 a1,    900  a2,  10 a3 from dual
    union all
    select '张三' name, '9-20' date1,  900 a1,    1000  a2,  10 a3 from dual
    union all
    select '李四' name, '9-20' date1,  1100 a1,    900  a2,  13 a3 from dual
    union all
    select '王五' name, '9-20' date1,  900 a1,    100  a2,  0 a3 from dual)
    select name "姓名", c "基本工资", decode(cnt, 1, '新增', '') "备注" from (select name,a1,date1,  a1-(lead(a1, 1, 0) over(partition by name order by date1 desc)) c, row_number() over(partition by name order by date1 desc) rn, sum(1) over(partition by name) cnt from temp) where rn = 1 and c<>0;
    姓名   基本工资 备注
    --- ---------- ----
    王五        900 新增
    张三       -100
      

  4.   

    在这里还忘了一种情况,那就是某个人删除了,如:
    序号,姓名,时间,基本工资,奖金,扣款 
    1    张三  8-20    1000    1000  5 
    2    李四  8-20    1100    900    10 
    3    john 8-20    900     900  9 
    4    张三  9-20    900    1000  10 
    5    李四  9-20    1100    900    13 
    6    王五  9-20    900    100    0查询结果是:
    序号,姓名,基本工资  备注 
    1    张三  -100 
    2    John  -900      删除   
    3    王五  900        新增 非常感谢各位大侠的指导,再次请教了
    万分感谢
      

  5.   

    select rownum id,name,salary, from(
    select a.id,case when a.name is null then b.name else a.name end name,
      nvl(a.salary,0)-nvl(b.salary,0)salary,
      case when b.name is null then '新增' 
      when a.name is null then '删除' end 
      from (select * from tt where date1='9-20') a 
      full join (select * from tt where date1='8-20') b 
      on a.name=b.name)
    where salary<>0  
      

  6.   

    楼上的在oracle9i的sql plus
    下显示
    column ambiguously defined这是什么原因?谢谢
      

  7.   

    rownum我删除了
    还是显示  在第一行 列的定义不明确
    麻烦各位看看了
      

  8.   

    没有更多的指导了
    郁闷ing
      

  9.   

    select case when a.name is null then b.name else a.name end name,
      nvl(a.salary,0)-nvl(b.salary,0) salary_change,
      case when b.name is null then '新增' 
      when a.name is null then '删除' end 
      from (select * from tt where date1='9-20') a 
      full join (select * from tt where date1='8-20') b 
      on a.name=b.name
    where nvl(a.salary,0) <> nvl(b.salary,0);