SqlServer查询之group by

  通常我们在对某表进行查询的时候,会发现有很多重复的数据,比如有张登录统计表,我们现在需要查出登录一次,登录二次,登录三次..的用户。如果根据用户的ID来统计的话,那样肯定是不行的,我们要统计的是一次的用户数量,而不是某个用户的登录次数.碰到这个问题的时候我们就可以用到group by了。入下:

select UserID,COUNT(UserID) total from Tb group by UserID

      这样就可以实现根据UserID来分组了,查询结果有两列,第一列是Userid,第二列是该UserID出现的次数,这个次数也就是我们需要的登录次数了。这里要啰嗦下的是,查询的字段必须是在聚合函数group by中出现过的字段,不然会报错的。这样查出来的结果中,次数的统计排序是乱的,如果想要统计的结果按从少到多排序的话,可以这样:

select COUNT(UserID) total,UserID from Tb group by UserID order by total asc

      如果我们想在查询出的结果中只取登录一次的用户ID的话,那么我们需要这样做:

select COUNT(UserID) total,UserID from Tb group by UserID having COUNT(UserID)=1 order by total asc

  大家看到了这里加了个having,这个是在聚集函数的结果集中取符合条件的,注意,这个地方如果写成 having total=1会提示列名“total“无效。其实有些时候这样写还是没完,因为这样查出来的还是张二维表,如果我们需要统计登录一次的用户的总数,那么这个时候该怎么做呢?其实用上面的语句也能实现,只不过在程序中统计下这表的行数就够,但是那样是不合理的,那样的结果会导致不必要的数据在传输,其实我们要的是个整数,传出的只要个整数就够了,没必要来张表的传输。如果要传输这个整数,该怎么写呢?如下:

select COUNT(ID) from( select ID from Tb group by ID having COUNT(ID)=1 ) as t

  这样就可以统计出行数了。注意的是这里的子查询必须是存在的列,如果用Count(ID)的话会报错。

  好了SqlServer的group by 想写的已经都写完了,在最后声明下,本人不是高手,所写的都是本人的一些平时开发过程中的经验,在这总结下,不保证说的都对的,如果有错的地方望海涵,也希望能及时指正。

原文地址:https://www.cnblogs.com/_fyz/p/SqlGrouopBy.html