用group by 汇总时,为了显示出某列信息,用max()高效呢?还是group by 多几层高效呢?

wycfgq 2010-03-29 10:52:50
用group by 汇总时,为了显示出某列信息,用max()高效呢?还是group by 多几层高效呢?
比如字段如下:

单号,请购日期,请购人,制单时间,请购金额
001,2009-1-1,aaa,2009-1-1,898.89
001,2009-1-1,aaa,2009-1-1,45.45
001,2009-1-1,aaa,2009-1-1,6789.39
001,2009-1-1,aaa,2009-1-1,5000

002,2009-1-1,aaa,2009-1-1,10
002,2009-1-1,aaa,2009-1-1,8.89
002,2009-1-1,aaa,2009-1-1,9090.9

我想按单号汇总金额,但同时显示出请购时间,请购人,制单时间
如何写代码高效呢?
是用:
group by 单号,请购日期,请购人,制单时间

还是用:
select 单号,max(请购日期),max(请购人),max(制单时间),sum(请购金额)
group by 单号
高效呢?

...全文
589 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
我赞成用max,这个效率我觉得会高点,
sxiaohui8709253 2010-03-30
  • 打赏
  • 举报
回复
学习了
仙道彰 2010-03-30
  • 打赏
  • 举报
回复
这个应该一样的吧。
仙道彰 2010-03-30
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 gll0809 的回复:]
我认为group by 好,我在平常就经常用
[/Quote]
犀利哥
gll0809 2010-03-30
  • 打赏
  • 举报
回复
我认为group by 好,我在平常就经常用
小坏猪猪 2010-03-30
  • 打赏
  • 举报
回复
个人觉得group by相对而言占有一定的优势,lz可以考虑在索引上下点功夫
ACMAIN_CHM 2010-03-30
  • 打赏
  • 举报
回复
都一样,关键看你的索引的情况,
wycfgq 2010-03-30
  • 打赏
  • 举报
回复
执行计划不会看。
claro 2010-03-29
  • 打赏
  • 举报
回复
@2F:执行计划只能做参考,通常也是不准的。
@LZ:至于用MAX() 还是多GROUP BY 关键看数据结果是否正确,这两个没多大关系!
不用GROUP BY 可以尝试exists 取数据。MAX在这里和性能没多大关系哦。

SQL77 2010-03-29
  • 打赏
  • 举报
回复
我想按单号汇总金额,但同时显示出请购时间,请购人,制单时间
如何写代码高效呢?
是用:
group by 单号,请购日期,请购人,制单时间

还是用:
select 单号,max(请购日期),max(请购人),max(制单时间),sum(请购金额)
group by 单号


楼主可以看一下执行计划,不过楼主这样的结果不同的吧,两个语句

分组的统计不同
wycfgq 2010-03-29
  • 打赏
  • 举报
回复
你0001的日期就没有其它的了吗,你分组的列不同,统计结果不同的
----------------------------
是的,多条记录是同一个日期,同一个请购时间,
期实上面的表我简化了,实际上是一个主子表。
我把主表与子表连接后,写出来了,为了说明问题。
流氓兔 2010-03-29
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 sql77 的回复:]
引用 3 楼 wycfgq 的回复:
引用 2 楼 claro 的回复:
@2F:执行计划只能做参考,通常也是不准的。
@LZ:至于用MAX() 还是多GROUP BY 关键看数据结果是否正确,这两个没多大关系!
不用GROUP BY 可以尝试exists 取数据。MAX在这里和性能没多大关系哦。

你没明白我的意思,
因为一个select 如果用了group by 后,凡是不在gr……
[/Quote]
应该根据分组情况来!
claro 2010-03-29
  • 打赏
  • 举报
回复
呵呵,我明白您的意思。
你说的两种方式实际上性能开销是差不多的。
因为GROUP BY的性能开销大部分在排序和表扫描。
--但是我上面强调的是MAX对数据的影响。
比如:
--new data:
CREATE TABLE TEST (A VARCHAR(10),B VARCHAR(10),C VARCHAR(10),D VARCHAR(10),E FLOAT)
GO
INSERT INTO TEST
SELECT '001','2009-1-1','aaa','2009-1-1',898.89 UNION ALL
SELECT '001','2009-1-1','aaa','2009-1-1',45.45 UNION ALL
SELECT '001','2009-1-1','aaa','2009-1-1',6789.39 UNION ALL
SELECT '001','2009-1-1','aaa','2009-1-1',5000 UNION ALL
SELECT '002','2009-1-1','aaa','2009-1-1',10 UNION ALL
SELECT '002','2009-1-1','aaa','2009-1-1',8.89 UNION ALL
SELECT '002','2009-1-1','aaa','2009-1-1',9090.9
GO
(7 行受影响)

select
A.A,A.B,A.C,A.D,SUM(A.E)
from
TEST a

GROUP BY
A.A,A.B,A.C,A.D

--result:
A B C D
---------- ---------- ---------- ---------- ----------------------
001 2009-1-1 aaa 2009-1-1 12733.73
002 2009-1-1 aaa 2009-1-1 9109.79

(2 行受影响)


--alter data:
INSERT INTO TEST
SELECT '001','2009-2-1','bbb','2009-2-1',5000 UNION ALL
SELECT '002','2009-2-1','bbb','2009-2-1',10
(2 行受影响)

--方式二:

select
A,MAX(B) B,MAX(C) C,MAX(D) D,SUM(E) E
from
TEST
GROUP BY
A

--result:
A B C D E
---------- ---------- ---------- ---------- ----------------------
001 2009-2-1 bbb 2009-2-1 17733.73
002 2009-2-1 bbb 2009-2-1 9119.79

(2 行受影响)


guguda2008 2010-03-29
  • 打赏
  • 举报
回复
一样的
SQL77 2010-03-29
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 wycfgq 的回复:]
引用 2 楼 claro 的回复:
@2F:执行计划只能做参考,通常也是不准的。
@LZ:至于用MAX() 还是多GROUP BY 关键看数据结果是否正确,这两个没多大关系!
不用GROUP BY 可以尝试exists 取数据。MAX在这里和性能没多大关系哦。

你没明白我的意思,
因为一个select 如果用了group by 后,凡是不在group by 后的字段必须加上聚合函数,……
[/Quote]
你0001的日期就没有其它的了吗,你分组的列不同,统计结果不同的
huangheguyun 2010-03-29
  • 打赏
  • 举报
回复
字段上加上聚合函数,这样的执行效率会高一点的。
htl258_Tony 2010-03-29
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 wycfgq 的回复:]
引用 2 楼 claro 的回复:
@2F:执行计划只能做参考,通常也是不准的。
@LZ:至于用MAX() 还是多GROUP BY 关键看数据结果是否正确,这两个没多大关系!
不用GROUP BY 可以尝试exists 取数据。MAX在这里和性能没多大关系哦。

你没明白我的意思,
因为一个select 如果用了group by 后,凡是不在group by 后的字段必须加上聚合函数,……
[/Quote]
如果那些列的内容都一样,推荐用GROUP BY 各列吧.
wycfgq 2010-03-29
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 claro 的回复:]
@2F:执行计划只能做参考,通常也是不准的。
@LZ:至于用MAX() 还是多GROUP BY 关键看数据结果是否正确,这两个没多大关系!
不用GROUP BY 可以尝试exists 取数据。MAX在这里和性能没多大关系哦。
[/Quote]
你没明白我的意思,
因为一个select 如果用了group by 后,凡是不在group by 后的字段必须加上聚合函数,
所以我是问,是在字段上加上聚合函数好,还是将字段直接写在 group by 后面好呢?

34,590

社区成员

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

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