实在不好意思,我还想问个问题,现在我是选出来了,可是我又碰到个问题:我现在在 select XXX,b.location as 地点,MAX(b.date) as 时间 from d A join (select XXX from a,b,c where.........) B on A.id = B.id group by XXX.b.location因为这里我在select里用了MAX()所以,所以一定要在最后加group by,可是这里出现了一个问题! 就是因为我现在想得出的就是比如下面的一个结果(某个人离现在最近的一个时间所在的地点) 姓名 地点 时间 张三 上海 2006-1-1 李四 昆明 2005-12-31 但是数据库里,可能有这样几条纪录(或多条纪录) 张三 上海 2006-1-1 张三 海南 2005-12-12 张三 上海 2006-12-5 张三 海南 2005-1-1 现在我只想得出 张三 上海 2006-1-1 可是如果用了MAX(date)聚合函数,在select 地点的时候必须把它列到group by 否则没法会报错,可是如果列了,那么得到的结果就是 张三 上海 2006-1-1 张三 海南 2005-12-12 因为它根据地点group了,可是这不是我想要的啊,我想要的就是关于每个人最近去过的地方,也就是只要 张三 上海 2006-1-1这要怎么写才能得出我想要的结果啊,帮帮我吧!
第一点:你的max(date)函数实现不了(即选出)关于每个人最近去过的地方! 举例: 2006-1-1和 2006-12-5 两个时间 max()后选出的是前面个而不是后面个 因为字符'-'比 字符'2'大,字符排序! 需要改为: max(cast(b.date as datetime)) 经转化后再比较!第二点: 你可以只根据人名group by 就可以用max()函数了, 为什么非还要对地点group by呢? 不知道你全部的表结构是怎样的
说一个笨方法,子查询select XXX, (select top 1 location from b where id=B.id order by date desc) as 地点, --b.location as 地点, MAX(b.date) as 时间 from d A join (select XXX from a,b,c where.........) B on A.id = B.id group by XXX.b.location你看看是否可以
修改了group by子句,这样看看select XXX, (select top 1 location from b where id=B.id order by date desc) as 地点, --b.location as 地点, MAX(b.date) as 时间 from d A join (select XXX from a,b,c where.........) B on A.id = B.id group by XXX
可可,谢谢你关于第一点的提醒 我现在的问题是:在select中,我想显示列 name,location,MAX(date),如果我只在select里面选择location,而在group by 里面不加上location的话,sql就会报错亚:" location在选择列表里无效,因为它既不包含在聚合函数里,又不包含在group by 子句中",所以必须加啊!你说应该怎么办?
可以这样转:给你个例子,你看看先 declare @p table(a int ,b int ,c int) insert @p select 1,2,3 union all select 2,2,3 union all select 1,3,5 union all select 2,4,6 union all select 2,4,2 select a,c=max(c) from @p group by aselect d.* from @p d join (select a,c=max(c) from @p group by a)t on d.a=t.a and d.c=t.c
如果你写:select a,b,c=max(c) from @p group by a 就会出现你那个错误!
join (select XXX from a,b,c where.........) B
on A.id = B.id
group by XXX.b.location因为这里我在select里用了MAX()所以,所以一定要在最后加group by,可是这里出现了一个问题! 就是因为我现在想得出的就是比如下面的一个结果(某个人离现在最近的一个时间所在的地点)
姓名 地点 时间
张三 上海 2006-1-1
李四 昆明 2005-12-31
但是数据库里,可能有这样几条纪录(或多条纪录)
张三 上海 2006-1-1
张三 海南 2005-12-12
张三 上海 2006-12-5
张三 海南 2005-1-1
现在我只想得出
张三 上海 2006-1-1
可是如果用了MAX(date)聚合函数,在select 地点的时候必须把它列到group by 否则没法会报错,可是如果列了,那么得到的结果就是
张三 上海 2006-1-1
张三 海南 2005-12-12
因为它根据地点group了,可是这不是我想要的啊,我想要的就是关于每个人最近去过的地方,也就是只要
张三 上海 2006-1-1这要怎么写才能得出我想要的结果啊,帮帮我吧!
举例: 2006-1-1和 2006-12-5 两个时间 max()后选出的是前面个而不是后面个
因为字符'-'比 字符'2'大,字符排序!
需要改为: max(cast(b.date as datetime)) 经转化后再比较!第二点: 你可以只根据人名group by 就可以用max()函数了,
为什么非还要对地点group by呢?
不知道你全部的表结构是怎样的
(select top 1 location from b where id=B.id order by date desc) as 地点,
--b.location as 地点,
MAX(b.date) as 时间 from d A
join (select XXX from a,b,c where.........) B
on A.id = B.id
group by XXX.b.location你看看是否可以
(select top 1 location from b where id=B.id order by date desc) as 地点,
--b.location as 地点,
MAX(b.date) as 时间 from d A
join (select XXX from a,b,c where.........) B
on A.id = B.id
group by XXX
我现在的问题是:在select中,我想显示列 name,location,MAX(date),如果我只在select里面选择location,而在group by 里面不加上location的话,sql就会报错亚:" location在选择列表里无效,因为它既不包含在聚合函数里,又不包含在group by 子句中",所以必须加啊!你说应该怎么办?
declare @p table(a int ,b int ,c int)
insert @p
select 1,2,3 union all
select 2,2,3 union all
select 1,3,5 union all
select 2,4,6 union all
select 2,4,2 select a,c=max(c) from @p group by aselect d.* from @p d join (select a,c=max(c) from @p group by a)t
on d.a=t.a and d.c=t.c
就会出现你那个错误!
字段值不要为null