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

摘要:
你真的知道如何玩SQL吗?在逻辑查询处理阶段,您真的玩SQL吗?和平大使,内部联系,外部联系你真的玩SQL吗?你真的能用三种范式和数据完整性来玩SQL吗?EXISTS和IN的区别你真的玩SQL吗?表表达式,排名函数你真的玩SQL吗?玩数据报告的存储过程(第2部分)你真的玩SQL吗?稍后使用的用例数据库在SQL2008中。如果您已经阅读了本系列的前几篇文章,则不需要创建基本的示例数据库。

 

你真的会玩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

将输出以下内容

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

接下来讲讲各类聚合……

1.累积聚合

 为每个雇员和每个月,返回从其开始有订单操作以来到该月份处理过的订单总量和每月的平均量,结果如下,怎么做?

你真的会玩SQL吗?你所不知道的 数据聚合第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
GROUP BY o1.empid ,
        o1.ordmonth ,
        o1.qty
ORDER BY o1.empid ,
        o1.ordmonth

若想得到雇员达到累积总量<1000之前的每月聚合值,怎么做?

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

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.滑动聚合

 滑动聚合是对序列内的一个滑动窗口进行的聚合计算,而不是从序列的开始计算到当前位置。

 求雇员最近三个月(包括本月)的平均订单量(移动平均数),得到以下结果:

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

你真的会玩SQL吗?你所不知道的 数据聚合第5张你真的会玩SQL吗?你所不知道的 数据聚合第6张
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
View Code

这里使用的是o2.ordmonth> 3个月之前的月份 and o2.ordmonth<=o1.当前月份

3.年初至今

聚合按年单位算,如求每个雇员每年内的每个月份的聚合,该怎样写?结果如下:

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

你真的会玩SQL吗?你所不知道的 数据聚合第5张你真的会玩SQL吗?你所不知道的 数据聚合第9张
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))
                                      + '0101' AS DATETIME)
                                    )
GROUP BY o1.empid ,
        o1.ordmonth ,
        o1.qty
ORDER BY o1.empid ,
        o1.ordmonth
View Code

所有聚合函数都会忽略NULL值,只有一个例外:Count(*)

聚合中常见的函数为分组函数GROUP BY ,要注意的是 GROUP BY 原则 select后面所有列中 没有使用聚合函数的列必须出现在GROUP BY 后面

免责声明:文章转载自《你真的会玩SQL吗?你所不知道的 数据聚合》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇pycharm使用matplotlib绘图学习笔记[html]浏览器标签小图标LOGO简单设置下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

应用程序框架实战三十四:数据传输对象(DTO)介绍及各类型实体比较

本文将介绍DDD分层架构中广泛使用的数据传输对象Dto,并且与领域实体Entity,查询实体QueryObject,视图实体ViewModel等几种实体进行比较。 领域实体为何不能一统江湖? 当你阅读我或其它博主提供的示例代码时,会发现几种类型的实体,这几种实体初步看上去区别不大,只是名称不同,特别在这些示例非常简单的情况下更是如此。你可能会疑惑为何要搞得...

面面俱到:SQL SERVER 2008主数据管理

SQLSERVER 2008R2中提供了主数据服务。很多人对主数据服务比较陌生。我们先介绍主数据服务的应用范畴。 主数据服务是当企业的规模达到一定的规模后,因企业信息化战略发展的需要。需要将企业内信息进行统一规划、形成制定统一的标准。建立一套统一的公共数据标准及维护体系、一个统一的公共数据平台。使其各子系统均按照统一的标准使用公共数据。使企业在信息化形成一...

SQL SERVER 2012设置自动备份数据库

  为了防止数据丢失,这里给大家介绍SQL SERVER2012数据自动备份的方法:   一、打开SQL SERVER 2012,如图所示:      服务器类型:数据库引擎;   服务器名称:127.0.0.1(本地),也可以选择远程连接;   身份验证:包含Windows身份验证和 SQL Server身份验证,此处选择Windows 身份验证;  ...

在asp.net webform中的 gridview 里面的一些基本操作

<body> <form runat="server"> <table cellspacing="0" cellpadding="0" border="0"> <tr> <td> <asp:Panel runat="server" CssClass="buttonContainer" Wr...

Fake SQL Tuning, v$session, etc...

随便起了个名字,因为不知道叫啥好。主要是想把最近遇到的一个事情简单记录下,仅此而已。为啥叫Fake SQL Tuning, 自然不是真正地谈SQL优化,因为我也说不出来啥玩意,毕竟SQL优化不是简单的一两句话就可以说出个所以然的。 最近遇到个问题,我负责维护的一个产品的用户说他们有一个process老是跑不完,卡在那里。这个产品前端用PB做,中间部分计算引...

JDBC 基础入门

由于我也是初学参考的是网上的或者是培训机构的资料所以可能会有错误的信息,仅供参考 一、什么是JDBC(Java Data Base Connectivity)? java程序连接数据库,JDBC是由SUN公司提出的一组规范,这组规范主要由一组接口构成,主要作用就是访问数据库。 二、JDBC核心思想【思想重要】     三、核心API【重点】      ...