首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

聚合函数MAX的使用解决思路

2012-03-06 
聚合函数MAX的使用已有人发过此问题了,回复的答案并没有解决实际问题。我想把wumingcnd的问题再发一次。name

聚合函数MAX的使用
已有人发过此问题了,回复的答案并没有解决实际问题。
我想把     wumingcnd       的问题再发一次。
name [date]  balance      
    张三 2002-1-1 80      
    张三 2002-5-1 200      
    张三 2002-7-1 100      
    李四 2002-8-1 70      
    李四 2002-9-1 90      
    李四 2002-10-1       100      
    王五 2001-1-1 300      
    王五 2002-1-1 200      
    王五 2003-1-1 100      
       
    我想查出来每个人(name)   最后一天([date])   的   金额(balance),怎么查?      
       
    目标数据就是这样的:      
    name [date]  balance      
    张三 2002-7-1 200      
    李四 2002-10-1       100      
    王五 2003-1-1 300      

回复的答案是:

select       *       from       table          
    where       date       in       (select       max(data)       from       table       group       by       name)

但是在实际应用中,查询结果确是:

    张三 2002-1-1 80      
    张三 2002-5-1 200      
    张三 2002-7-1 100      
    李四 2002-8-1 70      
    李四 2002-9-1 90      
    李四 2002-10-1       100      
    王五 2001-1-1 300      
    王五 2002-1-1 200      
    王五 2003-1-1 100  


希望高手大虾们能够帮帮忙,先谢谢啦......




[解决办法]
select * from [table] a where not exists(select 1 from [table] where name=a.name and [date]> a.[date])
[解决办法]
建表
CREATE TABLE tb ( name varchar(10),[date] datetime,balance decimal)

初始化数据
insert into tb select '张三 ', '2002-1-1 ',80
union all select '张三 ', '2002-5-1 ',200
union all select '张三 ', '2002-7-1 ',100
union all select '李四 ', '2002-8-1 ',70
union all select '李四 ', '2002-9-1 ',90
union all select '李四 ', '2002-10-1 ',100
union all select '王五 ', '2001-1-1 ',300
union all select '王五 ', '2002-1-1 ',200
union all select '王五 ', '2003-1-1 ',100


跟据你的描述: 我想查出来每个人(name) 最后一天([date]) 的 金额(balance),怎么查?
得到以下SQL语句:
select * from tb where date in (select max([date]) from tb group by [name])


结果:
name date balance
---------- ------------------------------------------------------ --------------------
张三 2002-07-01 00:00:00.000 100
李四 2002-10-01 00:00:00.000 100
王五 2003-01-01 00:00:00.000 100


跟据你的目标数据


目标数据就是这样的:
name [date]  balance
张三 2002-7-1 200
李四 2002-10-1 100
王五 2003-1-1 300


得出这样的SQL语句:
select a.[name],a.[date],b.balance
from(select [name] as [name],max([date]) as [date] from tb group by [name])a
INNER JOIN(
select [name] as [name],max(balance) as [balance] from tb group by [name]
) b ON a.[name]=b.[name] order by a.[date],b.[balance]

得出目标结果:

name date balance
---------- ------------------------------------------------------ --------------------
张三 2002-07-01 00:00:00.000 200
李四 2002-10-01 00:00:00.000 100
王五 2003-01-01 00:00:00.000 300

热点排行