你真的会玩SQL吗?系列目录

你真的会玩SQL吗?之逻辑查询处理阶段

你真的会玩SQL吗?和平大使 内连接、外连接

你真的会玩SQL吗?三范式、数据完整性

你真的会玩SQL吗?查询指定节点及其所有父节点的方法

你真的会玩SQL吗?让人晕头转向的三值逻辑

你真的会玩SQL吗?EXISTS和IN之间的区别

你真的会玩SQL吗?无处不在的子查询

你真的会玩SQL吗?Case也疯狂

你真的会玩SQL吗?表表达式,排名函数

你真的会玩SQL吗?简单的 数据修改

你真的会玩SQL吗?你所不知道的 数据聚合

你真的会玩SQL吗?透视转换的艺术

你真的会玩SQL吗?冷落的Top和Apply

你真的会玩SQL吗?实用函数方法汇总

你真的会玩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吗?你所不知道的 数据聚合的更多相关文章

  1. 你真的会玩SQL吗?简单的数据修改

    你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接.外连接 你真的会玩SQL吗?三范式.数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节 ...

  2. 你真的会玩SQL吗?删除重复数据且只保留一条

    在网上看过一些解决方法 我在此给出的方法适用于无唯一ID的情形 表:TB_MACVideoAndPicture 字段只有2个:mac,content mac作为ID,正常情况下mac数据是唯一的,由于 ...

  3. 你真的会玩SQL吗?之逻辑查询处理阶段

    你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接.外连接 你真的会玩SQL吗?三范式.数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节 ...

  4. 你真的会玩SQL吗?和平大使 内连接、外连接

    你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接.外连接 你真的会玩SQL吗?三范式.数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节 ...

  5. 你真的会玩SQL吗?三范式、数据完整性

    你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接.外连接 你真的会玩SQL吗?三范式.数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节 ...

  6. 你真的会玩SQL吗?让人晕头转向的三值逻辑

    你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接.外连接 你真的会玩SQL吗?三范式.数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节 ...

  7. 你真的会玩SQL吗?EXISTS和IN之间的区别

    你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接.外连接 你真的会玩SQL吗?三范式.数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节 ...

  8. 你真的会玩SQL吗?无处不在的子查询

    你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接.外连接 你真的会玩SQL吗?三范式.数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节 ...

  9. 你真的会玩SQL吗?Case也疯狂

    你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接.外连接 你真的会玩SQL吗?三范式.数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节 ...

随机推荐

  1. H5坦克大战之【画出坦克】

    今天是个特殊的日子,圣诞节,也是周末,在这里先祝大家圣诞快乐!喜庆的日子,我们可以稍微放松一下,扯一扯昨天雷霆对战凯尔特人的比赛,这场比赛大威少又双叒叕拿下三双,而且是一个45+11+11的超级三双, ...

  2. 深入理解 Java G1 垃圾收集器--转

    原文地址:http://blog.jobbole.com/109170/?utm_source=hao.jobbole.com&utm_medium=relatedArticle 本文首先简单 ...

  3. 以向VS 程序打包集成自动写入注册表功能为例,介绍如何实现自由控制安装过程

    最近由于项目部署时需要更灵活的控制程序安装的流程以及自定义安装行为,特意研究了一下VS程序打包,把解决办法和大家分享一下. 以VS2010为例: 这是一个已经设置好最基本的Visual Studio ...

  4. spring无法读取properties文件数据

    只讲述异常点,关于怎么配置文件,这里不做说明.   1. controller中无法读取config.properties文件 controller中注入的@Value配置是从servlet-cont ...

  5. 用angular怎么缓存父页面数据

    angular做单页面应用是一个比较好的框架,但是它有一定的入门难度,对于新手来说可能会碰到很多坑,也有许多难题,大部分仔细看文档,找社区是能解决的. 但有些问题也许资料比较少,最近遇到过一个要缓存父 ...

  6. JavaScript学习笔记(一)——延迟对象、跨域、模板引擎、弹出层、AJAX示例

    一.AJAX示例 AJAX全称为“Asynchronous JavaScript And XML”(异步JavaScript和XML) 是指一种创建交互式网页应用的开发技术.改善用户体验,实现无刷新效 ...

  7. POJ3693 Maximum repetition substring [后缀数组 ST表]

    Maximum repetition substring Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9458   Acc ...

  8. NYOJ 998

    这道题是欧拉函数的使用,这里简要介绍下欧拉函数. 欧拉函数定义为:对于正整数n,欧拉函数是指不超过n且与n互质的正整数的个数. 欧拉函数的性质:1.设n = p1a1p2a2p3a3p4a4...pk ...

  9. Storm

    2016-11-14  22:05:29 有哪些典型的Storm应用案例? 数据处理流:Storm可以用来处理源源不断流进来的消息,处理之后将结果写入到某个存储中去.不像其它的流处理系统,Storm不 ...

  10. JavaScript知识结构图

    画的一个知识结构图,方便理解.