select
a.人员id,
a.人员姓名,
a.现有分值,
isnull(b.执行前分值,a.现有分值) as 初始分值
from
表1 a
left join
(select t.* from 表2 t where not exists(select 1 from 表2 where 人员id=t.人员id and 加减分时间<t.加减分时间)) b
where
a.人员id=b.人员id
order by
a.id
a.人员id,
a.人员姓名,
a.现有分值,
isnull(b.执行前分值,a.现有分值) as 初始分值
from
表1 a
left join
(select t.* from 表2 t where not exists(select 1 from 表2 where 人员id=t.人员id and 加减分时间<t.加减分时间)) b
where
a.人员id=b.人员id
order by
a.id
解决方案 »
- 数值类型转换问题
- 莫名其妙的为难题The server was unable to load the SSL provider library needed to log in
- 在触发器里可不可以捕捉修改表的用户
- [高手进]两进程UPDATE同一笔记录时(前面没访问其他任何记录)100%出现死锁! 求指导! 是不是SQL的BUG或死锁的第三种情况?
- 用T-SQL语句如何获取当前月份的第一天的日期。我百度了,好像没有我要的,希望有大神指教下
- sql查询的问题
- 如何从一个文本文件中读取内容并赋给一个字段
- 下面查询中什么地方错了?
- 如何修改 远程数据库 服务器上的 表
- Insert和Indentity
- 关于sql的郁闷问题,你们碰到过吗
- 请高手指点(数据筛选)
a.现有分值 - (ISNULL(TotalChange,0)) 初始分值
FROM t1 a
LEFT JOIN
(SELECT 人员ID,SUM(执行后分值 - 执行前分值) TotoalChange FROM t2 GROUP BY 人员ID) b
ON a.人员ID=b.人员ID
insert into @t1 values(1,1,'a',5 )
insert into @t1 values(2,2,'b',12)
insert into @t1 values(3,3,'c',3 )declare @t2 table(id int,人员id int,加减分时间 datetime,执行前分值 int,执行后分值 int)
insert into @t2 values(1,1,'2007-8-2',10, 5)
insert into @t2 values(2,1,'2007-8-1',2 ,10)
insert into @t2 values(3,2,'2007-9-1',8 ,12)
select
a.人员id,
a.人员姓名,
a.现有分值,
isnull(b.执行前分值,a.现有分值) as 初始分值
from
@t1 a
left join
(select t.* from @t2 t where not exists(select 1 from @t2 where 人员id=t.人员id and 加减分时间<t.加减分时间)) b
on
a.人员id=b.人员id
order by
a.id/*
人员id 人员姓名 现有分值 初始分值
----------- ---------- ----------- -----------
1 a 5 2
2 b 12 8
3 c 3 3
*/
declare @t1 table(id int,人员id int,人员姓名 varchar(10),现有分值 int)
insert into @t1 values(1,1,'a',5 )
insert into @t1 values(2,2,'b',12)
insert into @t1 values(3,3,'c',3 ) declare @t2 table(id int,人员id int,加减分时间 datetime,执行前分值 int,执行后分值 int)
insert into @t2 values(1,1,'2007-8-2',10, 5)
insert into @t2 values(2,1,'2007-8-1',2 ,10)
insert into @t2 values(3,2,'2007-9-1',8 ,12)
select
a.人员id,
a.人员姓名,
a.现有分值,
isnull(b.执行前分值,a.现有分值) as 初始分值
from
@t1 a
left join
(select t.* from @t2 t where not exists(select 1 from @t2 where 人员id=t.人员id and 加减分时间 <t.加减分时间)) b
on
a.人员id=b.人员id
order by
a.id /*
人员id 人员姓名 现有分值 初始分值
----------- ---------- ----------- -----------
1 a 5 2
2 b 12 8
3 c 3 3
*/
insert into @t1 values(1,1,'a',5 )
insert into @t1 values(2,2,'b',12)
insert into @t1 values(3,3,'c',3 ) declare @t2 table(id int,人员id int,加减分时间 datetime,执行前分值 int,执行后分值 int)
insert into @t2 values(1,1,'2007-8-2',10, 5)
insert into @t2 values(2,1,'2007-8-1',2 ,10)
insert into @t2 values(3,2,'2007-9-1',8 ,12)
SELECT a.*,
a.现有分值 - (ISNULL(TotalChange,0)) 初始分值
FROM @t1 a
LEFT JOIN
(SELECT 人员ID,SUM(执行后分值 - 执行前分值) TotalChange FROM @t2 GROUP BY 人员ID) b
ON a.人员ID=b.人员ID
/*
1 1 a 5 2
2 2 b 12 8
3 3 c 3 3
*/
确实依赖变更记录,如果变更记录不全,那么初始值计算就不对.可以试着将子陌老大的子查询加not exist的方法改为聚合连表,连接的性能比较稳定,不随匹配率变化(或变化较低),能不能比not exists快,就看你的数据了.SELECT a.*,
ISNULL(b.执行前分值,a.执行前分值) 初始分值
FROM @t1 a
LEFT JOIN
(
SELECT x.* FROM @t2 x
INNER JOIN
(SELECT 人员id,MIN(加减分时间) mt
FROM @t2 GROUP BY 人员ID) y
ON x.人员id=y.人员id AND 加减分时间=mt
) b
ON a.人员id=b.人员id
declare @t1 table(id int,人员id int,人员姓名 varchar(10),现有分值 int)
insert into @t1 values(1,1,'a',5 )
insert into @t1 values(2,2,'b',12)
insert into @t1 values(3,3,'c',3 ) declare @t2 table(id int,人员id int,加减分时间 datetime,执行前分值 int,执行后分值 int)
insert into @t2 values(1,1,'2007-8-2',10, 5)
insert into @t2 values(2,1,'2007-8-1',2 ,10)
insert into @t2 values(3,2,'2007-9-1',8 ,12)
/*
人员id 人员姓名 现分值 初始分值
1 a 5 2
2 b 12 8
3 c 3 3
*/
select c.人员id,人员姓名,现有分值,isnull(执行前分值,现有分值) 初始分值 from @t1 c left join
(select 人员id,执行前分值 from @t2 a where not exists(select 1 from @t2 where a.执行前分值=执行后分值 and 人员id=a.人员id))b
on c.人员id=b.人员id
insert into @t1 values(1,1,'a',5 )
insert into @t1 values(2,2,'b',12)
insert into @t1 values(3,3,'c',3 ) declare @t2 table(id int,人员id int,加减分时间 datetime,执行前分值 int,执行后分值 int)
insert into @t2 values(1,1,'2007-8-2',10, 5)
insert into @t2 values(2,1,'2007-8-1',2 ,10)
insert into @t2 values(3,2,'2007-9-1',8 ,12)
select a.*, (isnull((select top 1 [执行前分值]
from @t2
where [人员id] = a.[人员id]
order by [加减分时间]), a.[现有分值])) as [初始分值]
from @t1 a
ISNULL(b.执行前分值,a.执行前分值) 初始分值
FROM @t1 a
LEFT JOIN
(
SELECT x.* FROM @t2 x
INNER JOIN
(SELECT 人员id,MIN(加减分时间) mt
FROM @t2 GROUP BY 人员ID) y
ON x.人员id=y.人员id AND 加减分时间=mt
) b
ON a.人员id=b.人员id