求大神写一条sql查询语句
上次余额充值金额当前余额姓名时间2.35100102.35张三02-153.55053.5张三03-1017.23200217.23张三04-1611.20100111....
上次余额 充值金额 当前余额 姓名 时间
2.35 100 102.35 张三 02-15
3.5 50 53.5 张三 03-10
17.23 200 217.23 张三 04-16
11.20 100 111.20 李四 03-20
5.72 100 105.72 李四 04-15
这是正常的记录,每个人消费到没什么钱之后去充值,【上次余额】应该比【上一次】充值的【当前余额】要少,但是现在有一部分人的充值出现了错误,导致多充了钱,【上次余额】会大于上一次的当前余额
上次余额 充值金额 当前余额 姓名 时间
2.35 100 102.35 张三 02-15
521.23 50 571.23 张三 03-10
412.50 100 512.50 张三 04-16
11.20 100 111.20 李四 03-20
905.75 100 1005.75 李四 04-15
变成了这样的结果,现在我想查出来按人(姓名)来分组查询,得到出现问题的这些记录(上次余额大于上次充值当前余额的记录)
也就是筛选出正常的记录,只留下有问题的记录
如果问题不清楚可以补充,或者+QQ 364640740 展开
2.35 100 102.35 张三 02-15
3.5 50 53.5 张三 03-10
17.23 200 217.23 张三 04-16
11.20 100 111.20 李四 03-20
5.72 100 105.72 李四 04-15
这是正常的记录,每个人消费到没什么钱之后去充值,【上次余额】应该比【上一次】充值的【当前余额】要少,但是现在有一部分人的充值出现了错误,导致多充了钱,【上次余额】会大于上一次的当前余额
上次余额 充值金额 当前余额 姓名 时间
2.35 100 102.35 张三 02-15
521.23 50 571.23 张三 03-10
412.50 100 512.50 张三 04-16
11.20 100 111.20 李四 03-20
905.75 100 1005.75 李四 04-15
变成了这样的结果,现在我想查出来按人(姓名)来分组查询,得到出现问题的这些记录(上次余额大于上次充值当前余额的记录)
也就是筛选出正常的记录,只留下有问题的记录
如果问题不清楚可以补充,或者+QQ 364640740 展开
3个回答
展开全部
select 上次余额,充值金额,当前余额,姓名 ,时间,dbo.f_CheckData(用户ID,时间,上次余额) as flag
from table name
假设针对用户有唯一ID
create function f_CheckData(@用户ID,@时间,@上次余额)
returns char(1)
as
begin
declare @LastTimeSurplus float
declare @Flag char(1)
declare @count int
set @Flag ='N'
set @LastTimeSurplus =0
set @count =0
--取最近一笔充值记录,
select @count=count(1)FROM TABLENAME WHERE 用户ID=@用户ID and 时间< @时间 ORDER BY 时间 DESC
if @count>0
begin
获取该次结馀金额
SELECT TOP 1 @LastTimeSurplus FROM TABLENAME WHERE 用户ID=@用户ID and 时间< @时间 ORDER BY 时间 DESC
IF @LastTimeSurplus<@上次余额
set @flag='Y'
end
return @flag
end
这样FLAG取到Y的的就是有问题的了
from table name
假设针对用户有唯一ID
create function f_CheckData(@用户ID,@时间,@上次余额)
returns char(1)
as
begin
declare @LastTimeSurplus float
declare @Flag char(1)
declare @count int
set @Flag ='N'
set @LastTimeSurplus =0
set @count =0
--取最近一笔充值记录,
select @count=count(1)FROM TABLENAME WHERE 用户ID=@用户ID and 时间< @时间 ORDER BY 时间 DESC
if @count>0
begin
获取该次结馀金额
SELECT TOP 1 @LastTimeSurplus FROM TABLENAME WHERE 用户ID=@用户ID and 时间< @时间 ORDER BY 时间 DESC
IF @LastTimeSurplus<@上次余额
set @flag='Y'
end
return @flag
end
这样FLAG取到Y的的就是有问题的了
展开全部
就是说说啊,这个表本身确实。。有点问题。
如果同一天同一个人充值2次,记录上怎么区分呢,如果姓名相同怎么区分呢。没有辅助的账单维护表和客户维护表,太可能出问题了,导致现在查询也不好考虑(因为没有唯一标识列,也没有主键顺序吧)
如果同一天同一个人充值2次,记录上怎么区分呢,如果姓名相同怎么区分呢。没有辅助的账单维护表和客户维护表,太可能出问题了,导致现在查询也不好考虑(因为没有唯一标识列,也没有主键顺序吧)
追问
呃,你说的这些都有的...我只是模拟出来一个有相关信息的表,时间是精确到秒的,主键和客户关系表都是有的..
追答
三楼兄弟思路基本和我一样,不赘述了。存储过程解决好些。如果是实际应用,不在乎是1条语句还是存储过程。输出的时候写到一个表里面,就比较直观了。肯定要递归或者循环解决
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
select 上次余额,充值金额,当前余额,姓名,时间 from
表 where 上次余额>(充值金额+当前余额)
表 where 上次余额>(充值金额+当前余额)
更多追问追答
追问
这个不行吧,我是要找【上次余额】会大于【上一次】的【当前余额】
关键在于上一次啊,也就是跨行查询..
追答
bhtzu 说的是呀。你这个数据表设计的不合理。
另外,你要非要这么设计,那你得想办法杜绝错误的充值记录。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询