五个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子句的汇总数据进行特定的过滤器。希望你需要收集一些数据,下一次,你可以使它更容易实现。