到t-sqldml 7级的楼梯:使用一个简单的组一个条款地总结数据
这个楼梯将为您提供一个基本的理解如何使用来自sql服务器表的数据,使用sql服务器的transact-sql(t-sql)方言。dml是数据操作语言,也是处理数据的语言的方面。它包括语句的选择、插入、更新和删除。这个阶梯也将提供一些sql语言的历史和一些关于集合论的一般概念。每个级别将建立在先前的级别之上,因此,当您完成时,您将对如何从sql服务器中选择和修改数据有很好的了解。
在楼梯6我教你如何使用顺序排序你的数据。这使您可以根据单个列或多个列的顺序对详细记录进行排序。如果您想在特定的记录中看到数据,详细的数据是非常好的,但是有时您需要将详细的数据卷到汇总的值中。总结你的数据,你可以完成使用组一个条款。
按条款分组有两种。一个是一个简单的群,一个是一个子句,另一个是提供了一个简单的概括,一个子句,称为一般群。这两种类型之间的主要区别是简单组通过包含一个子句只包含该组,而一般组通过子句包含其他运算符,如卷起和多维数据集。
在本文中,我将介绍如何使用简单的组对数据进行分组。在后续条款中,我将逐条涵盖更复杂的一般群体。
一个条款的简单分组
使用一个子句的简单组,可以根据单个列、多个列或表达式对数据进行聚合。根据组中每个子句指定的列和/或表达式,将只返回每个唯一值的一个摘要行。当sql服务器逐子句处理一组时,它将详细记录按唯一的列或表达式值分组,然后根据选择列表中包含的聚合函数总结每个集合。
为了更好地掌握如何使用该组,让我们假设您有一个表,其中包含了不同商店的详细销售信息,并希望按商店汇总销售总额。您可以按条款使用该组来汇总每个商店的总销售额。在此示例中,您要分组的唯一列将是商店名称,而要聚合的列将是销售金额。您的结果将显示每个独特的商店名称的一行,而每个商店的行将包含该商店的销售额之和。
sql服务器在可通过查询包含在组的选择列表中的列上有一定的限制。按查询方式在组的选择列表中指定的每一列都需要归入以下类别之一:
组中按子句指定的列
组中按子句指定的表达式
从聚合函数返回的值
如果列不属于这些类别中的任何一类,则在试图通过查询运行组时会出现错误。注意,不需要在选择列表中按子句列出组中包含的列或表达式。
让我举几个例子来演示如何使用简单的组和子句来获取摘要值。
一个条款地探索简单组的样本数据
为了演示如何逐句使用一个简单的组,我需要构建一些示例数据。我提供了一个脚本来创建我的示例数据,这样您就可以运行本文中提供的示例代码。在列表1中使用脚本来构建和填充示例表。
使用临时设备;
走吧
不计在内;
----创建销售表
创建表格,创建表格
(身份识别主键
、CustomerName VARCHAR(65)
,销售总额
、SalesTypeDesc VARCHAR(200)
,SalesDateTime DATETIME
,编号为varchar(100));
----在销售表中添加数据
插入到dbo.salestronact中
价值("约翰史密斯"、124.23、"软件"、"09/22/2011:11:51:12"、"软件出口");
插入到dbo.salestronact中
价值(‘Jack Thomas’,29.56,‘电脑用品’,‘09/23/2011 10:21:49上午’,‘软件插座’);
插入到dbo.salestronact中
价值("起诉猎人"、89.45、"计算机用品"、"09/23/20112:51:56"、"软件出口");
插入到dbo.salestronact中
("Karla Johnson"、"759.12"、"软件"、"09/23/2011下午2:54:37"、"软件出口");
插入到dbo.salestronact中
值(“Gary Clark”、81.51、“软件”、“09/22/2011上午11:08:52”、“折扣软件”);
插入到dbo.salestronact中
价值("Scott Crochet"、12345.78、"计算机用品"、"09/23/2011下午3:12:37"、"折扣软件");
插入到dbo.salestronact中
价值(`Sheri Holtz'、12.34、`软件'、`09/23/2011上午10:51:42、`折扣软件');
插入到dbo.salestronact中
价值("Mary Lee",101.34,"软件",09/23/2011,09:37:19,"折扣软件");
插入到dbo.salestronact中
价值(‘Sally Davisson’、‘871.12’、‘软件’、‘09/22/201105:21:28下午’、‘折扣软件’);
插入到dbo.salestronact中
价值(‘Rod Kaplan’、2345.19、‘电脑用品’、‘09/23/2011下午5:01:11’、‘折扣软件’);
插入到dbo.salestronact中
价值(“Sandy Roberts”、76.38、“书籍”、“09/23/20114:51:57”、“电脑”)
价值("Sandy Roberts"、76.38、"书籍"、"09/23/2011:下午4:51:57"、"计算机书籍和软件");
插入到dbo.salestronact中
("Marc Trotter",562.94,"软件","09/23/2011,下午6:51:43","计算机书籍和软件");
列表1:创建示例数据的脚本
如果你看一下清单1中的脚本,你会发现我创建了dbo.salestrus动作表。然后,我在这个表格中插入了一些记录。我将使用此表演示如何使用一个简单的分组来聚合数据。
按单列分组
使用使用清单1创建的示例表,第一个示例将使用逐句组根据单个列总结数据。我在清单2中的例子总结了我的样本数据基于命名列。
使用临时设备;
走吧
选择“缩放”
,总数(销售总额)为存款额
来自dbo.萨勒斯特朗行动
按组分置;
列表2:按单列分组
当清单2中的代码在示例表中执行时,将返回报表1中的下列聚合行。
燃料消耗量
第二十七天:
计算机书籍和软件639.32
折扣软件15757.28
软件出口1002.36
报告1:以单栏为基础的样本数据汇总
如果您查看报表1中的输出,您可以看到,对于命名的每个唯一值,只返回一个聚合行。每个记录上的存款额是通过使用su对每个商店的销售记录的销售总额栏进行汇总来计算的。由多列组合
有些时候,您需要开发一个报表,在其中您的数据需要被多列分组。为了完成这一任务,您只需要逐句向组添加额外的列。如果在组中按子句指定多个列,则sql服务器将根据组中按子句排列的每个列的唯一值组合对详细的行进行聚合。在列表3中,我将列表2中的查询进行了扩展,在列表中按条款添加了第二栏。
使用临时设备;
走吧
选择“费用”,“销售总额”,和(销售总额)为“费用总额”
来自dbo.萨勒斯特朗行动
按组分,按组;
列表3:按单列分组
当我使用清单3中的代码来对比我的样本数据时,我得到了报告2中的结果。
StoreName SalesTypeDesc StoreSalesAmount
--------------------------------------------------------------
电脑书籍及软件书籍76.38
计算机用品14690.97
软件插座电脑供应119.01
计算机书籍和软件
折扣软件1066.31
软件出口软件883.35
报告2:运行列表1的输出
在报告2中,你可以看到,存货量现在被归纳为存货量和销售水平。还请注意,返回的聚合行不是根据组中每个子句的列按顺序排序的。如果我想把汇总的数据按重命名顺序显示出来,那么我就需要在选择的语句中逐条列出一个顺序。我将由您在清单3的代码中添加订单,以返回汇总数据的顺序。
逐句使用组中的表达式
有时,您可能希望将数据按特定的列或列集合以外的其他内容分组。例如,您可能希望根据一些varchar列的前几个字符,或者仅仅是日期或日期时间列的月份来总结数据。sql服务器允许您在组中逐句指定表达式以完成此操作。表达式可以是基于正在聚合的详细记录集中的列的任何有效表达式。要演示如何在组中按子句使用表达式,请查看要演示如何在组中按子句使用表达式,请查看列表4中的代码。
使用临时设备;
走吧
选择“转换(char(10),销售时间,101)”为“销售日期”
,总数(销售总额)为销售总额
来自dbo.萨勒斯特朗行动
按转换分组(Char(10),销售时间,101);
列表4:按单列分组
在列表4中,选择语句是根据表达式对数据进行分组,在这种情况下是转换函数。如果在组中按子句使用表达式,则必须在选择列表中使用相同的精确表达式。转换函数正在解析“保存时”列,并只返回该列的日期部分。使用分组中的转换功能,可以根据不同销售记录的实际日期对销售数据进行汇总。通过这样做,我总结了我的样本,得到了所有商店按日期计算的销售总额,如报告3所示。
SalesDate TotalSalesAmount
---------
09/22/2011 1076.86
09/23/2011 16322.10
报告3:汇总基于表达式的数据时的输出
使用表达式可以让您以编程方式识别您的详细数据的哪些部分将被用来聚合您的数据。
有条款
如果您正在与该组逐子句聚合数据,则可能不想返回所有的聚合值。相反,您可能只希望返回聚合值的子集。拥有子句可以用来选择性地通过总结来识别要从组中返回的聚合值。
通常,当我们选择数据时,我们使用where子句来限制返回的行。唯一的问题是子句在行值上运行,而不是在聚合值上运行。因此,在哪里子句不能使用由组一个子句创建的聚合值。但是,在您的组之后逐句添加一个已有的子句,为您提供了一种方式来指定条件,以识别您想要返回的特定的汇总值。为了更好地理解这一点,让我给大家举几个例子。
在查看商店销售数据时,通常使用的条款之一是确定那些没有达到特定销售限额的商店。如果你想找到所有没有达到最低销售额的商店,你可以用清单5中的代码来做。
使用临时设备;
走吧
选择“缩放”
,总数(销售总额)为存款额
来自dbo.萨勒斯特朗行动
按类别分组
金额(销售总额)<1000.00;
清单5:通过使用有从句限制结果集
在列表5中,我将结果集限制在总销售额低于1000.00的商店。在我举的这个微不足道的例子中,你会发现“电脑书籍和软件”这个名称是唯一没有达到1000.00美元销售限额的商店。
具有从句可以用在同样不聚合的列上。如果您想根据组中任何一个按子句使用的列的特定值来限制返回的行,您也可以这样做,而列表6演示了这一点。
使用临时设备;
走吧
选择“缩放”
,总数(销售总额)为存款额
来自dbo.萨勒斯特朗行动
按类别分组
有类似“%出口%”的名称
或重新命名为“%图书%”;
列表6:限制基于逐栏分组的结果集
在列表6中,我只希望看到商店名称中有“出口”或“书籍”的商店的汇总数据。这个例子还表明,在拥有条款中,你可以有多个条件。另一种思考哪里和拥有之间的区别的方法是,子句在数据聚合之前过滤数据行,而拥有子句则通过应用来过滤在组之后的聚合行。
用简单的组逐句总结数据
在本文中,我向您演示了如何使用简单的分组来总结您的数据。我讨论了如何使用单个列、多个列以及组中的表达式来总结详细的数据。通过使用我所演示的内容,您现在应该可以建立一个简单的分组来总结您的数据,并且可以选择使用keef来筛选总结的数据。
在我的下一篇文章中,我将逐条扩展我对这个小组的讨论。在本文的后续文章中,我将向您展示如何使用多维数据集和汇总运算符来生成额外的汇总数据,例如小计和总计值。
这篇文章是通往t-sql dml楼梯的楼梯的一部分
注册我们的rss订阅,并在我们发布一个新的级别后立即得到通知。