本文我们将讨论如何使用GROUPBY子句来汇总数据。

使用单独列分组

GROUP BY子句通过设置分组条件来汇总数据,在第一个例子中,我在数据库AdventureWork2012中的表 Sales.SalesOrderDetail.中的一列上进行数据分组操作。这个例子以及其他例子都使用数据库AdventureWorks2012,如果你想使用它运行我的代码,你可以点击下载。

下面是第一个示例的源码,在CarrierTrackingNumber列上使用group by子句进行数据分组操作

USE AdventureWorks2012;  GO  SELECT CarrierTrackingNumber  ,SUM(LineTotal) AS SummarizedLineTotal  FROM AdventureWorks2012.Sales.SalesOrderDetail  GROUP BY CarrierTrackingNumber; 
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 

如果我想获得CarrierTrackingNumber 满足特定条件下的聚集集合,那我可以在Where子句中对查询进行限制,就像我下面做的这样:

USE AdventureWorks2012;  GO  SELECT CarrierTrackingNumber  ,SUM(LineTotal) AS SummarizedLineTotal  FROM AdventureWorks2012.Sales.SalesOrderDetail  WHERE CarrierTrackingNumber = '48F2-4141-9A'  GROUP BY CarrierTrackingNumber; 

通过多列来分组

有时候你可能需要使用多列来进行数据分组,下面是我使用多列进行分组的示例代码

SELECT D.ProductID  , H.OrderDate  , SUM(LineTotal) AS SummarizedLineTotal  FROM AdventureWorks2012.Sales.SalesOrderDetail D  JOIN AdventureWorks2012.Sales.SalesOrderHeader H  ON D.SalesOrderId = H.SalesOrderID  GROUP BY ProductID, OrderDate; 
ProductID OrderDate LineTotal  -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --  714 2008-05-21 00:00:00.000 99.980000  859 2007-11-03 00:00:00.000 48.980000  923 2007-11-23 00:00:00.000 14.970000  712 2007-12-22 00:00:00.000 62.930000  795 2007-10-14 00:00:00.000 2443.350000  950 2007-07-01 00:00:00.000 2462.304000  795 2007-11-06 00:00:00.000 2443.350000  877 2007-11-19 00:00:00.000 15.900000  713 2007-10-01 00:00:00.000 99.980000  860 2008-05-31 00:00:00.000 48.980000  961 2008-05-01 00:00:00.000 36242.120880 
SELECT D.ProductID  , H.OrderDate  , SUM(LineTotal) AS SummarizedLineTotal  FROM AdventureWorks2012.Sales.SalesOrderDetail D  JOIN AdventureWorks2012.Sales.SalesOrderHeader H  ON D.SalesOrderId = H.SalesOrderID  GROUP BY ProductID, OrderDate  ORDER BY SummarizedLineTotal DESC; 

对没有任何值的数据进行分组

有时候你会需要对一些记录中包含空值的数据进行分组操作。当你在SQL Server 执行此类操作时,它会自动假设所有NULL值相等。让我看一下下面的示例程序

CREATE TABLE NullGroupBy (OrderDate date, Amount Int);  INSERT INTO NullGroupBy values (NULL,100),  ('10-30-2014',100),  ('10-31-2014',100),  (NULL,100);  SELECT OrderDate, SUM(Amount) as TotalAmount  FROM NullGroupBy  GROUP BY OrderDate;  DROP TABLE NullGroupBy;  When I run this code I get the following output:  OrderDate TotalAmount  -- -- -- -- -- -- -- -- -- -- -  NULL 200  2014-10-30 100  2014-10-31 100 

在Group BY 子句中使用表达式

有时你需要在Group by子句中使用表达式,而不是具体的列。SQL Server允许你在Group By子句中指定一个表达式,就像下面的代码中所示:

SELECT CONVERT(CHAR(7),H.OrderDate,120) AS [YYYY-MM]  , SUM(LineTotal) AS SummarizedLineTotal  FROM AdventureWorks2012.Sales.SalesOrderDetail D  JOIN AdventureWorks2012.Sales.SalesOrderHeader H  ON D.SalesOrderId = H.SalesOrderID  GROUP BY CONVERT(CHAR(7),H.OrderDate,120)  ORDER BY SummarizedLineTotal DESC; 

使用HAVING子句过滤数据

Having 是另外一个能与Group BY 子句结合使用的重要子句,使用Having 子句,你可以过滤掉不符合Having子句所接表达式的数据行,当我在其上使用where子句时,在聚集之前就会产生过滤行为。Having 子句允许你基于某些标准过滤聚合行。想要更清楚地了解Having子句,请参考下面代码:

SELECT D.ProductID  , H.OrderDate  , SUM(LineTotal) AS SummarizedLineTotal  FROM AdventureWorks2012.Sales.SalesOrderDetail D  JOIN AdventureWorks2012.Sales.SalesOrderHeader H  ON D.SalesOrderId = H.SalesOrderID  GROUP BY ProductID, OrderDate  HAVING SUM(LineTotal) > 200000  ORDER BY SummarizedLineTotal DESC; 

总结

许多应用要求数据在展示之前要经过一定的汇总操作,GROUP BY子句就是SQL Server提供的汇总数据的机制。GROUPBY子句允许你使用HAVING子句对汇总数据进行特定的过滤。希望下次你需要汇总一些数据的时候,你可以更加容易的达到目的。

更多相关文章

  1. mybatisplus的坑 insert标签insert into select无参数问题的解决
  2. python起点网月票榜字体反爬案例
  3. 《Android开发从零开始》——25.数据存储(4)
  4. Android系统配置数据库注释(settings.db)
  5. Android中不同应用间实现SharedPreferences数据共享
  6. android图表ichartjs
  7. Android内容提供者源码
  8. android SharedPreferences
  9. Android(安卓)Paging组件Demo

随机推荐

  1. android:elevation属性,控制View底部渐变
  2. Android中RelativeLayout各个属性介绍
  3. android 之button 屏幕翻转
  4. 【目录】每次吃一点Android
  5. Android - Activity的四种启动模式
  6. Android 混淆代码有关问题总结
  7. Android 开发常用代码
  8. 推荐一个android学习网站
  9. Android开发环境搭建流程
  10. Android用户界面 UI组件--TextView及其子