你真的会玩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吗?查询指定节点及其所有父节 ...
随机推荐
- Chrome出了个小bug:论如何在Chrome下劫持原生只读对象
Chrome出了个小bug:论如何在Chrome下劫持原生只读对象 概述 众所周知,虽然JavaScript是个很灵活的语言,浏览器里很多原生的方法都可以随意覆盖或者重写,比如alert.但是为了保证 ...
- Enterprise Solution 3.1 企业应用开发框架 .NET ERP/CRM/MIS 开发框架,C/S架构,SQL Server + ORM(LLBL Gen Pro) + Infragistics WinForms
行业:基于数据库的制造行业管理软件,包含ERP.MRP.CRM.MIS.MES等企业管理软件 数据库平台:SQL Server 2005或以上 系统架构:C/S 开发技术 序号 领域 技术 1 数据库 ...
- 深入理解CSS中的margin负值
前面的话 margin属性在实际中非常常用,也是平时踩坑较多的地方.margin折叠部分相信不少人都因为这样那样的原因中过招.margin负值也是很常用的功能,很多特殊的布局方法都依赖于它.它看似简单 ...
- History API与浏览器历史堆栈管理
移动端开发在某些场景中有着特殊需求,如为了提高用户体验和加快响应速度,常常在部分工程采用SPA架构.传统的单页应用基于url的hash值进行路由,这种实现不存在兼容性问题,但是缺点也有--针对不支持o ...
- VS15 preview 5打开文件夹自动生成slnx.VC.db SQLite库疑惑?求解答
用VS15 preview 5打开文件夹(详情查看博客http://www.cnblogs.com/zsy/p/5962242.html中配置),文件夹下多一个slnx.VC.db文件,如下图: 本文 ...
- 获取 dhcp IP 过程分析 - 每天5分钟玩转 OpenStack(91)
前面我们已经讨论了 DHCP agent 的配置以及 namespace 如何隔离 dnsmasq 服务,本节将以 cirros-vm1 为例分析获取 DHCP IP 的详细过程. 在创建 insta ...
- ADO.NET编程之美----数据访问方式(面向连接与面向无连接)
最近,在学习ADO.NET时,其中提到了数据访问方式:面向连接与面向无连接.于是,百度了一下,发现并没有很好的资料,然而,在学校图书馆中发现一本好书(<ASP.NET MVC5 网站开发之美&g ...
- c# 基础 object ,new操作符,类型转换
参考页面: http://www.yuanjiaocheng.net/webapi/config-webapi.html http://www.yuanjiaocheng.net/webapi/web ...
- 云计算下PAAS的解析一
云计算下PAAS的解析一 PaaS是Platform-as-a-Service的缩写,意思是平台即服务. 把服务器平台作为一种服务提供的商业模式.通过网络进行程序提供的服务称之为SaaS( ...
- uboot环境配置
uboot环境配置 通过配置uboot让它在启动过程中从tftp获取内核和设备树,并从在加载内核之后把通过启动参数将"从nfs挂载根文件系统"传入内核.这个配置主要是通过uboot ...