前言

  分组就是将元数据通过某些条件划分为组,而聚合就是对这些组进行整合操作;在sqlserver数据库中使用的关键字group by使符合条件的集合通过某些字段分好组,再使用聚合函数(如max()、mix())整合结果集;

FreeSql的聚合分组与数据库命名一样,分组使用GroupBy(),配合Sum()、Max()、Min()等聚合方法进行聚合分组;

GroupBy分组聚合

  根据姓名分组(添加数据的时候使用了xx1,xx2这样的命名)后,使用Having()方法排除了记录数小于等于1的记录,并根据记录数进行了倒叙,查询了姓名和数量。

_freeSql.Select<Student>()
.GroupBy(x => new { Name = x.Name.Substring(0, 2) })
.Having(x => x.Count() > 1)
.OrderByDescending(x => x.Count())
.ToList(x => new { x.Key.Name, Count = x.Count() }); //[{"Name":"小明","Count":10},{"Name":"小红","Count":2}]
//SELECT substring(a.[Name], 1, 2), count(1) as1
//FROM[Student] a
//GROUP BY substring(a.[Name], 1, 2)
//HAVING(count(1) > 1)
//ORDER BY count(1) DESC

  

ToAggregate聚合

  官方推荐另一种不分组求聚合值的方法,就是使用 ToAggregate 替代 ToList

_freeSql.Select<Student>()
.Where(x => x.Age > 5)
.Aggregate(x => x.Avg(x.Key.Age), out var age);
//SELECT avg(a.[Age]) as1
//FROM [Student] a
//WHERE (a.[Age] > 5)
//结果为age的值

踩个坑

  如果使用这个写法会发生什么呢?

_freeSql.Select<Student>()
.Aggregate(x => new { count = x.Count(), sum = x.Sum(x.Key.Age) }, out var res)
.Where(x => x.Age > 5)
.ToList();

  前面说过ToAggregate 是代替ToList的,也就是说首先会去算一下记录数、和,赋值给变量res,然后再使用Age>5的条件去查一次数据,sql如下

SELECT count(1) as1, sum(a.[Age]) as2
FROM [Student] a SELECT a.[Id], a.[Name], a.[Age], a.[Status], a.[AddTime], a.[Remark], a.[Version], a.[ClassId]
FROM [Student] a
WHERE (a.[Age] > 5)

  

  所以上面的写法会造成两次查询,一次是执行Aggregate(),一次是执行ToList(),由于执行Aggregate()的时候没有条件,所以结果为全表的Count()、Sum(),将Aggregate()使用,就好理解了

  如果需要查询数据集,又要聚合查询,可以将Where提到前面,这样聚合也就有了条件;

_freeSql.Select<Student>()
.Where(x => x.Age > 5)
.Aggregate(x => new { count = x.Count(), sum = x.Sum(x.Key.Age) }, out var res)
.ToList();
//SELECT count(1) as1, sum(a.[Age]) as2
//FROM [Student] a
//WHERE (a.[Age] > 5) //SELECT a.[Id], a.[Name], a.[Age], a.[Status], a.[AddTime], a.[Remark], a.[Version], a.[ClassId]
//FROM [Student] a
//WHERE (a.[Age] > 5)

FreeSql学习笔记——7.分组聚合的更多相关文章

  1. Dubbo -- 系统学习 笔记 -- 示例 -- 分组聚合

    Dubbo -- 系统学习 笔记 -- 目录 示例 想完整的运行起来,请参见:快速启动,这里只列出各种场景的配置方式 分组聚合 按组合并返回结果,比如菜单服务,接口一样,但有多种实现,用group区分 ...

  2. SQL反模式学习笔记15 分组

    目标:查询得到每组的max(或者min等其他聚合函数)值,并且得到这个行的其他字段 反模式:引用非分组列 单值规则:跟在Select之后的选择列表中的每一列,对于每个分组来说都必须返回且仅返回一直值. ...

  3. Caliburn.Micro学习笔记(三)----事件聚合IEventAggregator和 Ihandle<T>

    Caliburn.Micro学习笔记目录 今天 说一下Caliburn.Micro的IEventAggregator和IHandle<T>分成两篇去讲这一篇写一个简单的例子 看一它的的实现 ...

  4. Mongodb学习笔记四(Mongodb聚合函数)

    第四章 Mongodb聚合函数 插入 测试数据 ;j<;j++){ for(var i=1;i<3;i++){ var person={ Name:"jack"+i, ...

  5. MongoDB学习笔记五:聚合

    『count』count是最简单的聚合工具,返回集合中的文档数量:> db.foo.count()0> db.foo.insert({"x" : 1})> db. ...

  6. 1.4(SQL学习笔记)分组、子查询、联结、组合查询

    一.分组 建表及数据填充语句下载:链接: https://pan.baidu.com/s/1WHYafwqKJEKq1kDwCH_Zlg 提取码: 3wy4 1.1初识分组 分组是按照某一列,将该列中 ...

  7. MongoDB 学习笔记之 group聚合

    group聚合: key: 分组字段 cond:过滤条件 reduce: curr是当前行 result是每组的结果集 initial : 组变量初始值 finalize: 统计一组后的回调函数 用g ...

  8. Java-马士兵设计模式学习笔记-代理模式-聚合与继承方式比较

    一.概述 1.目标:要在Tank的move()方法做时间代理及日志代理(可以设想以后还要增加很多代理处理),且代理间的顺序可活更换 2.思路: (1)聚合:代理类聚合了被代理类,且代理类及被代理类都实 ...

  9. MySql cmd下的学习笔记 —— 有关分组的操作(group by)

    (一) 把建立的goods表找到 (二) 当cat_id = 3时,计算所有商品的库存量之和 计算每个cat_id下的库存量(group by) 需要用到分组,把每个红框内的计算在一起 筛选出本店价比 ...

  10. maven 学习笔记--仓库,聚合和继承,私服搭建

    仓库 http://blog.csdn.net/wanghantong/article/details/36427433 聚合和继承 http://www.cnblogs.com/xdp-gacl/p ...

随机推荐

  1. 分析Java值传递与引用传递

    背景 今天在公司做需求的时候,突然遇到了这个问题,八股文背过,但是又记不大清楚了.索性写下来,方便我这笨蛋脑子下次看. 解释 理解这个问题在于看它的角度(强调.加粗) 那我们开始,Java中一切都是值 ...

  2. ECDH秘钥交换算法——使用流程

    目录 DH.ECDH 和 ECDHE 的关系 Flow chart Reference 背景: 对称加解密算法都需要一把秘钥,但是很多情况下,互联网环境不适合传输这把对称密码,有被中间人拦截的风险. ...

  3. COS数据工作流+云函数最佳实践 - 自定义音视频转码

    01 背景 音视频作为信息传播中流量占比最大的部分在各行业的业务中都弥足重要,而不同的业务场景中对音视频的处理逻辑可能具备行业的特殊性. 公有云虽然提供大量的视频处理服务供用户选择,但依然不能做到全面 ...

  4. 腾讯云对象存储 COS 荣获对象存储领导力奖!!!

    亚太内容分发大会暨 CDN 峰会一直致力于推动 CDN 产业深度融合发展和市场普及,现已成为亚太地区影响力最大的内容分发网络盛会. 十年来,在以腾讯云.阿里云.网宿科技等亚太 CDN 产业联盟成员孜孜 ...

  5. Rocky Linux8升级9随记

    发现Rocky Linux已经升级了9.0版本,看着自己用着的8.5版本,跃跃欲试,于是就索性升级了.两者的支持年限没有太大的差别,先说我的想法:升不升级无所谓. 并不是9.0有什么特别牛的特性,只是 ...

  6. Debian 9.5 解决中文显示乱码

    一.首先检查LOCALE情况 说明:DEBIAN因为基于GNU所以,对不同地域进行了不同的包支持,以LOCALE形式存在. 1.启动终端 #apt-get install locales 2.重新配置 ...

  7. manim边学边做--同伦变换

    在Manim中,移动一个元素除了之前介绍的方法之外,还可以通过同伦运算来移动一个元素. 与普通的移动元素方式相比,使用同伦运算移动一个元素时,实际上是在考虑整个空间的连续变形过程中元素的相应变化. 这 ...

  8. Qt开源作品4-网络调试助手

    一.前言 网络调试助手和串口调试助手是一对的,用Qt开发项目与硬件通信绝大部分都是要么串口通信(RS232 RS485 Modbus等),要么就是网络通信(TCP UDP HTTP等),所以一旦涉及到 ...

  9. 这是我见过最通俗易懂的SVD(奇异值分解)算法介绍

    线性代数是机器学习领域的基础,其中一个最重要的概念是奇异值分解(SVD),本文尽可能简洁的介绍SVD(奇异值分解)算法的基础理解,以及它在现实世界中的应用. SVD是最广泛使用的无监督学习算法之一,它 ...

  10. SSM或Spring Boot开发中,mapper包中的mapper.xml没有编译到targger中的解决办法

    SSM或Spring Boot开发中,mapper包中的mapper.xml没有编译到targger中的解决办法 在pom文件中加入如下配置: <resources> <!-- 编译 ...