五个SQLServer数据收集很容易做到

在这篇文章中,我们将讨论如何使用GROUPBY子句来收集数据。

使用单独的列组

组BY子句通过设置分组条件来汇总数据。在第一个例子中,我做的数据分组操作表的数据库adventurework2012 adventurework2012一列。这个例子,其他的例子使用数据库adventureworks2012,如果你想用它来运行我的代码,你可以点击下载。

以下是第一个例子的源码,使用组对数据分组业务的carriertrackingnumber列条款


使用adventureworks2012;



选择carriertrackingnumber

和(linetotal)作为summarizedlinetotal

从adventureworks2012.sales.salesorderdetail

集团通过carriertrackingnumber;



运行此代码后,得到3807条记录,这里是大结果集中的前五个值:


carriertrackingnumber linetotal

----------------------------------------------------------

6e46-440a-b5 2133.170700

b501-448e-96 4085.409800

8551-4cdf-a1 72616.524200

b65c-4867-86 714.704300

99ce-4ada-b1 16185.429200



在上面的例子中,我使用GROUP BY子句中选择列为dventureworks2012.sales.salesorderdetai数据表中的数据的集合,在这个例子中,我使用carriertrackingnumber当你收集数据,一个数据包,只出现在组中的列的条款只能选择清单中。以我为例,我使用聚合函数和计算LineTotal,为了方便,我把它的别名summarizedlinetotal。

如果我想让CarrierTrackingNumber满足特定条件下的聚集,然后我可以限制查询的WHERE子句中,我下一步做。


使用adventureworks2012;



选择carriertrackingnumber

和(linetotal)作为summarizedlinetotal

从adventureworks2012.sales.salesorderdetail

在carriertrackingnumber = '48f2-4141-9a

集团通过carriertrackingnumber;



在这里,我添加了基于原始查询的WHERE子句的限制。我把我的查询返回结果,carriertrackingnumber等于特定值。运行此代码后,我会得到的行数,carriertrackingnumber等于48f2-4141-9a的记录。过滤行为的WHERE子句生效之前的数据汇总。

按多列分组

有时可能需要使用多个列进行数据分组。下面是我用来在多列中进行分组的示例代码


选择d.productid

h.orderdate

和(linetotal)作为summarizedlinetotal

从adventureworks2012.sales.salesorderdetail D

加入adventureworks2012.sales.salesorderheader H

在d.salesorderid = h.salesorderid

组ID,订单;



查询返回26878行数据,这是上述查询返回的结果的一部分:


linetotal ProductID OrderDate

----------------------------------------------------------

714 2008-05-21 00:00: 0 99.980000

859 2007-11-03 00:00: 0 48.980000

923 2007-11-23 00:00: 0 14.970000

712 2007-12-22 00:00: 0 62.930000

795 2007-10-14 00:00: 0 2443.350000

950 2007-07-01 00:00: 0 2462.304000

795 2007-11-06 00:00: 0 2443.350000

877 2007-11-19 00:00: 0 15.900000

713 0 99.980000 00:00: 2007

860 2008-05-31 00:00: 0 48.980000

961 0 36242.120880 00:00: 2008-05-01



在上面的示例程序,ProductID列和OrderDate列GROUP BY子句中使用。SQL Server是基于两ProductID和订单相结合的独特性,它返回的值并设置别名linetotal summarizedlinetotal它。如果你看一下程序的输出,你会发现分组数据的SQL服务器,并返回的结果在没有特定的顺序,如果你需要返回排序后的结果按照一定的顺序,你需要使用的条款顺序,正如我在下面的代码。


选择d.productid

h.orderdate

和(linetotal)作为summarizedlinetotal

从adventureworks2012.sales.salesorderdetail D

加入adventureworks2012.sales.salesorderheader H

在d.salesorderid = h.salesorderid

组ID,订单

通过summarizedlinetotal倒序;



在上面的代码中,我整理的结果集,根据summorizedlinetotal降序排列,和该列的值是由分组的条款和使用linetotal使用聚合函数和一组。我安排的结果按降序对summorizedlinetotal的价值。如果你运行这个程序,你可以得到linetotal ProductID和订单数量最高。

没有任何价值的分组数据

有时需要在包含空值的一些记录中对数据进行分组。当您在SQLServer中执行这种操作时,它会自动假定所有空值都是相等的。


创建表的NullGroupBy(订单日期、金额int);

插入nullgroupby值(null,100),

('10-30-2014 ',100),

('10-31-2014 ',100),

(NULL,100);

选择订单,金额(金额)作为总量

从nullgroupby

集团的订单;

nullgroupby表;

当我运行这个代码时,我得到以下输出:

订单总额

贸易数据交换

空200

2014-10-30 100

2014-10-31 100



在上面的程序,我第一次创建和填充一个nullgroupby表。在这张表中,我把不同的四行,第一行和最后一行OrderDate列值为null,而其他两列有不同的订单价值。从上面的输出结果,你可以看到SQL Server聚集的两行空一行在OrderDate分组。

使用组内子句中的表达式

有时你需要在组表达式中使用的条款,而不是具体的column.sql服务器允许您指定在GROUP BY子句中的表达式,如下面的代码所示:


选择转换(char(7),h.orderdate,120)为yyyy-mm } {

和(linetotal)作为summarizedlinetotal

从adventureworks2012.sales.salesorderdetail D

加入adventureworks2012.sales.salesorderheader H

在d.salesorderid = h.salesorderid

集团通过转换(char(7),h.orderdate,120)

通过summarizedlinetotal倒序;



上面的代码是由OrderDate列日期分组。通过使用表达式转换(char(7),h.orderdate,120),我告诉SQL Server拦截OrderDate ODBC标准日期格式的前七个字符,即OrderDate yyyy mm部分。基于这样的表达,我可以找到一个特定的月总summarizelinetotal价值,语句组使用表达式,并linetotal值排序,我可以找出哪个月的summarizelinetotal是最大或最小的一个月。

使用带子句过滤数据。

是与从句结合的另一个重要从句。使用带子句,可以过滤不符合子句的表达式的数据行。当我使用它的WHERE子句时,我将在聚合之前过滤行为:


选择d.productid

h.orderdate

和(linetotal)作为summarizedlinetotal

从adventureworks2012.sales.salesorderdetail D

加入adventureworks2012.sales.salesorderheader H

在d.salesorderid = h.salesorderid

组ID,订单

具有总和(linetotal)> 200000

通过summarizedlinetotal倒序;



在上面的代码中,有条款限制和条件(linetotal)> 200000。HAVING子句确保聚合linetotal最终结果的价值(summarizedlinetotal)大于200000。通过使用HAVING子句的查询仅返回一行数据,该summarizedlinetotal大于200000.having SQL Server条款只允许返回数据的汇总结果满足HAVING子句的限制。

总结

许多应用程序需要的数据在演讲前接受一定的简易操作,和GROUPBY子句的SQL Server提供的汇总数据的机制。GroupBy子句允许你使用HAVING子句的汇总数据进行特定的过滤器。希望你需要收集一些数据,下一次,你可以使它更容易实现。