你真的会玩SQL吗?你所不知道的 数据聚合
你真的会玩SQL吗?系列目录
本章的内容与 你真的会玩SQL吗?透视转换内容 非常重要,非常重要,非常重要 ,不理解的可以慢慢看,回头看,过几天再看,以后很多思想需要以此为基础而演变。
此后用到的用例数据库是SQL2008里面的,若看过本系列之前的文章,创建过基础样例数据库就不用再创建。
若没有创建过的,用例数据库文件:链接:http://pan.baidu.com/s/1qW1QxA0 密码:dqxx
连续聚合
下面的例子将使用一个EmpOrdersr汇总表,每位雇员在每个月占一行,包含该雇员在一个月内处理过的订单数量,运行下代码创建数据:
CREATE TABLE EmpOrders
(
empid INT NOT NULL ,
ordmonth DATE NOT NULL ,--只取到月份2015-07-07
qty INT NOT NULL ,
PRIMARY KEY ( empid, ordmonth )
)
go
INSERT INTO EmpOrders
( empid ,
ordmonth ,
qty
)
SELECT o.empid ,
DATEADD(MONTH, DATEDIFF(MONTH, 0, o.orderdate), 0) AS ordmonth ,
SUM(qty) AS qty
FROM Sales.Orders AS o
JOIN Sales.OrderDetails AS od ON o.orderid = od.orderid
GROUP BY empid ,
DATEADD(MONTH, DATEDIFF(MONTH, 0, o.orderdate), 0)
查询:
SELECT empid ,
ordmonth ,
qty
FROM EmpOrders
ORDER BY empid ,
ordmonth
将输出以下内容

接下来讲讲各类聚合……
1.累积聚合
为每个雇员和每个月,返回从其开始有订单操作以来到该月份处理过的订单总量和每月的平均量,结果如下,怎么做?

SELECT o1.empid ,
o1.ordmonth ,
o1.qty AS qtythismonth ,
SUM(o2.qty) AS totalqty ,
CAST(AVG(1. * o2.qty) AS NUMERIC(12, 2)) AS avgqty
FROM EmpOrders AS o1
JOIN EmpOrders AS o2 ON o2.empid = o1.empid
AND o2.ordmonth <= o1.ordmonth
GROUP BY o1.empid ,
o1.ordmonth ,
o1.qty
ORDER BY o1.empid ,
o1.ordmonth
若想得到雇员达到累积总量<1000之前的每月聚合值,怎么做?

SELECT o1.empid ,
o1.ordmonth ,
o1.qty AS qtythismonth ,
SUM(o2.qty) AS totalqty ,
CAST(AVG(1. * o2.qty) AS NUMERIC(12, 2)) AS avgqty
FROM EmpOrders AS o1
JOIN EmpOrders AS o2 ON o2.empid = o1.empid
AND o2.ordmonth <= o1.ordmonth
GROUP BY o1.empid ,
o1.ordmonth ,
o1.qty
HAVING SUM(o2.qty)<1000
ORDER BY o1.empid ,
o1.ordmonth
对总量做一次HAVING过滤 HAVING SUM(o2.qty)<1000,而不是用WHERE,因为过滤是的聚合,而不是属性。
2.滑动聚合
滑动聚合是对序列内的一个滑动窗口进行的聚合计算,而不是从序列的开始计算到当前位置。
求雇员最近三个月(包括本月)的平均订单量(移动平均数),得到以下结果:

SELECT o1.empid ,
o1.ordmonth ,
o1.qty AS qtythismonth ,
SUM(o2.qty) AS totalqty ,
CAST(AVG(1. * o2.qty) AS NUMERIC(12, 2)) AS avgqty
FROM EmpOrders AS o1
JOIN EmpOrders AS o2 ON o2.empid = o1.empid
AND (o2.ordmonth <= o1.ordmonth AND o2.ordmonth > DATEADD(MONTH,-3,o1.ordmonth))
GROUP BY o1.empid ,
o1.ordmonth ,
o1.qty
ORDER BY o1.empid ,
o1.ordmonth
这里使用的是o2.ordmonth> 3个月之前的月份 and o2.ordmonth<=o1.当前月份
3.年初至今
聚合按年单位算,如求每个雇员每年内的每个月份的聚合,该怎样写?结果如下:

SELECT o1.empid ,
CONVERT( VARCHAR(7),o1.ordmonth ,121) AS ordmonth,
o1.qty AS qtythismonth ,
SUM(o2.qty) AS totalqty ,
CAST(AVG(1. * o2.qty) AS NUMERIC(12, 2)) AS avgqty
FROM EmpOrders AS o1
JOIN EmpOrders AS o2 ON o2.empid = o1.empid
AND ( o2.ordmonth <= o1.ordmonth
AND o2.ordmonth >= CAST(CAST(YEAR(o1.ordmonth) AS CHAR(4))
+ '' AS DATETIME)
)
GROUP BY o1.empid ,
o1.ordmonth ,
o1.qty
ORDER BY o1.empid ,
o1.ordmonth
所有聚合函数都会忽略NULL值,只有一个例外:Count(*)
聚合中常见的函数为分组函数GROUP BY ,要注意的是 GROUP BY 原则 select后面所有列中 没有使用聚合函数的列必须出现在GROUP BY 后面
你真的会玩SQL吗?你所不知道的 数据聚合的更多相关文章
- 你真的会玩SQL吗?简单的数据修改
你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接.外连接 你真的会玩SQL吗?三范式.数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节 ...
- 你真的会玩SQL吗?删除重复数据且只保留一条
在网上看过一些解决方法 我在此给出的方法适用于无唯一ID的情形 表:TB_MACVideoAndPicture 字段只有2个:mac,content mac作为ID,正常情况下mac数据是唯一的,由于 ...
- 你真的会玩SQL吗?之逻辑查询处理阶段
你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接.外连接 你真的会玩SQL吗?三范式.数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节 ...
- 你真的会玩SQL吗?和平大使 内连接、外连接
你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接.外连接 你真的会玩SQL吗?三范式.数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节 ...
- 你真的会玩SQL吗?三范式、数据完整性
你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接.外连接 你真的会玩SQL吗?三范式.数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节 ...
- 你真的会玩SQL吗?让人晕头转向的三值逻辑
你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接.外连接 你真的会玩SQL吗?三范式.数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节 ...
- 你真的会玩SQL吗?EXISTS和IN之间的区别
你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接.外连接 你真的会玩SQL吗?三范式.数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节 ...
- 你真的会玩SQL吗?无处不在的子查询
你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接.外连接 你真的会玩SQL吗?三范式.数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节 ...
- 你真的会玩SQL吗?Case也疯狂
你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接.外连接 你真的会玩SQL吗?三范式.数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节 ...
随机推荐
- 使用redis构建可靠分布式锁
关于分布式锁的概念,具体实现方式,直接参阅下面两个帖子,这里就不多介绍了. 分布式锁的多种实现方式 分布式锁总结 对于分布式锁的几种实现方式的优劣,这里再列举下 1. 数据库实现方式 优点:易理解 缺 ...
- ABP框架 - OData 集成
文档目录 本节内容: 简介 安装 安装Nuget包 设置模块依赖 配置你的实体 创建控制器 示例 获取实体列表 请求 响应 获取单个实体 请求 响应 获取单个实体及导航属性 请求 响应 查询 请求 响 ...
- HTML DOM 对象
本篇主要介绍HTML DOM 对象:Document.Element.Attr.Event等4个对象. 目录 1. Document 对象:表示文档树的根节点,大部分属性和方法都是对元素进行操作. 2 ...
- 获取Canvas当前坐标系矩阵
前言 在我的另一篇博文 Canvas坐标系转换 中,我们知道了所有的平移缩放旋转操作都会影响到画布坐标系.那在我们对画布进行了一系列操作之后,怎么再知道当前矩阵数据状态呢. 具体代码 首先请看下面的一 ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(72)-微信公众平台开发-消息处理
系列目录 前言 Senparc.Weixin.MP SDK提供了MessageHandler消息处理类 在作者的Wiki中也详细说明了如何定义这个类,下面我们来演示,消息的回复,及效果 了解Messa ...
- [C#] C# 知识回顾 - 异常介绍
异常介绍 我们平时在写程序时,无意中(或技术不够),而导致程序运行时出现意外(或异常),对于这个问题, C# 有专门的异常处理程序. 异常处理所涉及到的关键字有 try.catch 和 finally ...
- c#语言规范
0x00 分类 C#语言规范主要有两个来源,即我们熟知的ECMA规范和微软的规范.尽管C#的ECMA规范已经前后修订4次,但其内容仅仅到C# 2.0为止.所以慕容为了方便自己和各位方便查询,在此将常见 ...
- 要想提高PHP的编程效率,你必须知道的要点
1.当操作字符串并需要检验其长度是否满足某种要求时,你想当然地会使用strlen()函数.此函数执行起来相当快,因为它不做任何计算,只返回在zval 结构(C的内置数据结构,用于存储PHP变量)中存储 ...
- ES6之let命令详解
let与块级作用域 { var foo='foo'; let bar='bar'; } console.log(foo,'var'); //foo varconsole.log(bar ,'bar') ...
- CSS margin详解
以下的分享是本人最近几天学习了margin知识后,大有启发,感觉以前对margin的了解简直太浅薄.所以写成以下文章,一是供自己整理思路:二是把知识分享出来,避免各位对margin属性的误解.内容可能 ...