单表group的统计问题。。。如何取一天的最后条记录?

glvicky 2012-04-24 10:20:49
表结构如下:
id time1【时间】 usercode【会员名】 money【金额】 balance【余额】

如此,要统计查询时间内,单天的会员的消费金额,及【当天的最后余额】情况。


select CONVERT(nvarchar(10), Time1, 20) as Time2,usercode,(0-sum(money))
from [table] group by usercode,CONVERT(nvarchar(10), time1, 20) order by time2


因为money是有正有负的,负的表示消费,正的表示充值,当天的最后余额并不是最小的,请问如何取的?
我只会取当天某会员的最后一条记录。

select CONVERT(nvarchar(10), Time1, 20) as Time2,usercode,(0-sum(money)),max(id) as lastid
from [table] group by usercode,CONVERT(nvarchar(10), time1, 20) order by time2

可是在上面中,就不能lastid来判断了。。。
...全文
96 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
glvicky 2012-04-25
  • 打赏
  • 举报
回复
其实一开始走进死胡同了,不想在取列值里面写(select table)语句,怕数据大了会慢~
3楼可能没明白我的意思,我自己已经解决了,谢谢~
發糞塗牆 2012-04-25
  • 打赏
  • 举报
回复
只需要找出time1最大的那条记录,然后把会员名相同的“消费金额”sum起来就可以了,但是前提是你的time1要保证没有一模一样的。
select sum(balance)*(-1)
from 表 as a
where time1 In (select max (time1) from 表) and balance<0
group by 会员名

解释:select中乘以-1是为了在显示时能显示出金额,而不是负数。不直观。如果你的业务需要显示负数,可以取消乘以-1。
where time1 In (select max (time1) from 表)是为了找出最后一笔记录所对应的会员名,balance<0就是为了只找出消费金额。

如有漏洞。请指出。谢谢。
对于select top 1 *测试了一下,时间的确快一点。不过从关系数据库理论来说,top 还包含了排序与distinct,所以如果时间差不多,不写也行。
glvicky 2012-04-24
  • 打赏
  • 举报
回复
LastBalance = (select Balance From [table] c Where C.ID = Max(b.ID)),

这两种哪种好?
百年树人 2012-04-24
  • 打赏
  • 举报
回复
try
select 
CONVERT(nvarchar(10), Time1, 20) as Time2,
usercode,(0-sum(money)),
lastbalance=(select top 1 balance from [table] where usercode=t.usercode and CONVERT(nvarchar(10),time1,20)=CONVERT(nvarchar(10),time1,20) order by id desc)
from [table] t
group by usercode,CONVERT(nvarchar(10), time1, 20)
order by time2

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧