请教一个关于select查询问题

LRG315 2005-07-29 03:57:46

假如现有如下记录(模拟数据):

编号 地区 手机号码 月份 话费
UK001 天河 13561278999 11 125.5
UK001 天河 13561278563 11 165.8
UK001 天河 13561278259 11 75.0
UK001 天河 13561278452 11 55.6
UK001 天河 13561278328 11 95.1
UK002 花都 13825415489 11 158.0
UK002 花都 13825415556 11 56.8
UK002 花都 13825415449 11 145.9
UK002 花都 13825415159 11 168.5
UK002 花都 13825415002 11 189.3
UK002 花都 13825415063 11 99.0
UK002 花都 13825415943 11 101.5
UK003 白云 13755083456 11 125.3
UK003 白云 13755083578 11 198.5
UK003 白云 13755083885 11 168.9
UK003 白云 13755083874 11 126.5
UK003 白云 13755083145 11 96.0

现要汇总各个地区话费最高的记录,要求显示出全部字段,比如:
UK001 天河 13561278563 11 165.8
UK002 花都 13825415002 11 189.3
UK003 白云 13755083578 11 198.5

请问Select语句该怎样写,谢谢!
...全文
296 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
flamezzh 2005-08-04
  • 打赏
  • 举报
回复
select 编号,地区,min(手机号码),min(月份),max(话费) from tdtb group by 地区,编号
QQMagicer 2005-08-04
  • 打赏
  • 举报
回复
谢谢各位的支持,但我对下面这句还不是很懂
LRG315(光)
------------------

select * from 表 t where not exists
(select 1 from 表 where 编号=t.编号 and 话费>t.话费)

为什么我对(select 1 from 表 where 编号=t.编号 and 话费>t.话费)改成:
(select * from 表 where 编号=t.编号 and 话费>t.话费)

查询结果一样,我是新手,请再帮我解释清楚一点好吗?谢谢!


-----------------

这个涉及到查询效率问题,如果你的表中的字段很多的话,select * from 表 where ... 就会很浪费时间,如果select 1 from 表 where ...,很自然的,存在时候我就给个1,相对要省很多时间, 总而言之,not exists就是指结果非空唠
Z_X_H 2005-08-03
  • 打赏
  • 举报
回复
已经找到答案了.
54989875 2005-07-31
  • 打赏
  • 举报
回复
mark
hglhyy 2005-07-31
  • 打赏
  • 举报
回复

正解!大家的思路可以向一楼学习!

select * from 表 t
where not exists(select 1 from 表 where 编号=t.编号 and 话费>t.话费)

rivery 2005-07-30
  • 打赏
  • 举报
回复
补充:max(话费)的那条记录不一定就对应的是min(手机号码),min(月份)。
rivery 2005-07-30
  • 打赏
  • 举报
回复
来玩了。就做个解释把。
第一:
通过表自身联合把不需要的记录过滤掉。就是取出最大花费的记录。
第二:
语句有错。不能得到正确的结果。
因为min(月份)和max(话费)不一定是同条记录。
LRG315 2005-07-30
  • 打赏
  • 举报
回复
下面这两句看不懂,有谁能帮我解释一下,谢谢!
第一:
select * from 表 t
where not exists(select 1 from 表 where 编号=t.编号 and 话费>t.话费)

第二:
select min(编号),地区,min(手机号码),min(月份),max(话费) from t group by 地区




LRG315 2005-07-30
  • 打赏
  • 举报
回复
谢谢各位,我试试再来给分
yumecho 2005-07-30
  • 打赏
  • 举报
回复
select min(编号),地区,min(手机号码),min(月份),max(话费) from t group by 地区
order by 地区,max(话费) desc
MorningTea 2005-07-30
  • 打赏
  • 举报
回复
in 也会被sql server的编译器转化为exists来执行,当资料很大,in非常慢,而且有null值得时候会使not in失去效用,总之用in比较符合我们的思维习惯,但是也要防止陷阱!!

select min(编号),地区,min(手机号码),min(月份),max(话费) from t group by 地区
可能不一定对,因为你目前的测试数据只有一个月呀!
BeginnerBBB 2005-07-30
  • 打赏
  • 举报
回复
(not) exists 返回的是一个bool值,它只判断是否有满足条件,与选择的具体的列没有关系,与in 的用法不一样。
LRG315 2005-07-30
  • 打赏
  • 举报
回复
谢谢各位的支持,但我对下面这句还不是很懂
select * from 表 t where not exists
(select 1 from 表 where 编号=t.编号 and 话费>t.话费)

为什么我对(select 1 from 表 where 编号=t.编号 and 话费>t.话费)改成:
(select * from 表 where 编号=t.编号 and 话费>t.话费)

查询结果一样,我是新手,请再帮我解释清楚一点好吗?谢谢!

fishead37 2005-07-30
  • 打赏
  • 举报
回复
既然最高地区的费用。,那你要显示出手机号码做什么,有什么意义。
jinfeiyang 2005-07-30
  • 打赏
  • 举报
回复
select * from 表 a
where not exists(select * from 表 where 编号=a.编号 and 话费>a.话费)
lichunlei2003 2005-07-30
  • 打赏
  • 举报
回复
select * from 表 t1 inner join
(select 编号,max(话费) from 表 group by 编号) t2 on t1.编号=t2.编号


这个比较合理,应该试试!支持!
xiaoMONKEY 2005-07-30
  • 打赏
  • 举报
回复
select * from 表 a where 话费 >= ALL(SELECT 话费 From 表 WHERE 编号 = a.编号)
huohw 2005-07-29
  • 打赏
  • 举报
回复
select * from TABLE where 话费 in
(
select max(话费) from TABLE group by 地区
)

SELECT * FROM TABLE AS A
INNER JOIN (SELECT 地区, MAX(话费) 话费 FROM TABLE GROUP BY 地区) B ON A.地区=B.地区 AND A.话费=B.话费
好,呵呵,学习……
flyorgao 2005-07-29
  • 打赏
  • 举报
回复
SELECT * FROM TABLE AS A
INNER JOIN (SELECT 地区, MAX(话费) 话费 FROM TABLE GROUP BY 地区) B ON A.地区=B.地区 AND A.话费=B.话费
flyorgao 2005-07-29
  • 打赏
  • 举报
回复
SELECT * FROM TABLE AS A
INNER JOIN (SELECT 地区, MAX(话费) 话费 FROM TABLE) B ON A.地区=B.地区 AND A.话费=B.话费
加载更多回复(10)

34,576

社区成员

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

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