日期:2014-05-17  浏览次数:20460 次

关于group by 的疑问
脑子抽了。。
对某一个字段汇总,group by后面为什么要把所有select出来的字段都写在group by 后面才行。。。。

比如:select a.fk0 as 订单号,fk1 as 产品编号,fk2 as 产品名称, sum(fk3)as 数量 group by fk1

上面这句就报错说要把其它字段也group by 上,也就是:
select a.fk0 as 订单号,fk1 as 产品编号,fk2 as 产品名称, sum(fk3)as 数量 group by fk0,fk1,fk2,fk3

假如很复杂的很多字段那岂不是。。。

应该是我没有掌握好group by 这个,时间久了没写,快忘了。。。
------解决方案--------------------
因为T-SQL查询的顺序是先group by再select,如果group by中没有,那么意味着你的结果集中没有这些列,那select的时候当然会报错。
------解决方案--------------------
是的,只要你要显示出来就要写出来
不过你确定都一样的话可以这样

select fk0,max(fk1)...max(f3),sum(fk3) from tb group by fk0.
------解决方案--------------------
如果group by后面不出现的字段,又希望在select后面出现,那必须使用聚合函数才行。
------解决方案--------------------
group by原理是通过规则将一个数据集划分成若干个区域,然后根据这若干个小区域进行数据处理
和这个规则没关的东西是放不进来的,如果必须放进来的数据,那这个数据必须对规则有意义,比如进行聚合运算等.这个单记录的个体属性就转变成对规则有实际意义的群体属性了
------解决方案--------------------
不想都写上后面,就有开窗函数呗

前提你的MSSQL要2005+
------解决方案--------------------
联机丛书有很多例子,有group by all的,但是不建议后续使用