有一个表,结构如下:
编号,姓名,时间,基本工资,奖金,扣款
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 张三 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语句实现呢?
谢谢
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
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
(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
序号,姓名,时间,基本工资,奖金,扣款
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 新增 非常感谢各位大侠的指导,再次请教了
万分感谢
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
下显示
column ambiguously defined这是什么原因?谢谢
还是显示 在第一行 列的定义不明确
麻烦各位看看了
郁闷ing
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);