数据库中如何分类、分组并总计SQL数据

数据库中如何分类、分组并总计SQL数据,第1张

数据库中如何分类、分组并总计SQL数据,第2张

你需要知道如何使用一些SQL子句和运算符来排列SQL数据,并高效地进行分析。以下建议告诉您如何构建语句并获得想要的结果。

以有意义的方式安排数据可能是一个挑战。有时候你只需要做一个简单的分类。通常你要做更多的处理——分组以便于分析和汇总。幸运的是,SQL提供了大量用于分类、分组和总计的子句和运算符。以下建议将帮助您了解何时分类、何时分组、何时以及如何进行合计。

1.分类和排序

通常,我们确实需要对所有数据进行排序。SQL的ORDER BY子句按字母或数字顺序排列数据。因此,同类数据显然被划分到各种组中。但是,这些群体只是分类的结果,并不是真正的群体。Order显示每条记录,而一个组可以代表多条记录。

2.分组减少相似数据。

分类和分组的区别在于,分类数据显示所有记录(在任何定义的标准内),而分组数据不显示这些记录。Group子句减少记录中的相似数据。例如,GROUP BY可以从重复这些值的源文件中返回新邮政编码列表:

按邮政编码从客户
组中选择邮政编码


只包括在“分组依据”和“选择列”列表中按语义分组的那些列。换句话说,选择列表必须与组列表匹配。只有一个例外:选择列表可以包含聚合函数。(而GROUP BY不支持聚合函数。)

请记住,GROUP BY不会对结果生成的组进行分类。若要按字母顺序或数字顺序对组进行排序,请添加ORDER BY子句(#1)。此外,不能在GROUP BY子句中引用带有别名的域。列必须在根数据中,但它们不必出现在结果中。

3.分组前定义数据。

您可以添加WHERE子句来限制按GROUP BY分组的数据。例如,以下语句只返回肯塔基州客户的邮政编码列表。

SELECT ZIP
FROM Customers
WHERE State = ' KY '
GROUP BY ZIP


记住WHERE在GROUP BY子句计算其值之前筛选数据是很重要的。

与GROUP BY一样,WHERE不支持聚合函数。

4.返回所有组。

当使用WHERE筛选数据时,结果组只显示您指定的那些记录。符合组定义但不符合子句条件的数据不会出现在组中。无论WHERE条件如何,如果您希望包括所有数据,请添加ALL子句。例如,在前面的语句中添加ALL子句将返回所有邮政编码组,而不仅仅是肯塔基州的邮政编码组。

SELECT ZIP
FROM Customers
WHERE State = ' KY '
GROUP BY ALL ZIP


实际上,这两个子句会引起冲突,您可能不会这样使用ALL子句。当使用聚合来查找列的值时,应用ALL子句会很方便。例如,以下语句计算每个肯塔基州邮政编码的客户数,并显示其他邮政编码的值。

SELECT ZIP,Count(ZIP)AS KYCustomersByZIP
FROM Customers
,其中State = 'KY'
GROUP BY ALL ZIP


获得的组由根数据中的所有邮政编码组成。但是,聚合列(KYCustomerByZIP)显示为0,因为除了Kentucky邮政编码组之外没有其他组。

远程查询不支持GROUP BY ALL。

5.分组后定义数据。

WHERE子句(#3)计算GROUP BY子句之前的数据。如果要在分组后限定数据,请使用HAVING。通常,无论您使用WHERE还是HAVING,都会得到相同的结果。但重要的是要记住,这两个条款是不可互换的。如果你有疑问,这里有一个应用指南:筛选记录时使用WHERE筛选组时使用HAVING。

通常,您将使用HAVING通过聚合来查找组的值。例如,以下语句返回邮政编码列表,但该表可能不包含根数据源中的每个邮政编码:

SELECT ZIP,Count(ZIP)AS Customers BY ZIP
FROM Customers
GROUP BY ZIP
Count(ZIP)= 1


只有那些只有一个客户的组才会出现在结果中。
6。了解更多关于在哪里和拥有。

如果您仍然不清楚WHERE和HAVING的用法,请遵循以下原则:

WHERE出现在GROUP BY之前;SQL在对记录进行分组之前先计算WHERE子句。

HAVING出现在GROUP BY之后;在SQL分组记录后查找HAVING子句的值。

7.用聚合总计对值进行分组。

对数据进行分组有助于分析数据,但有时您需要组本身以外的其他信息。您可以添加聚合函数来合计分组数据。例如,以下语句显示每种排序的小计:

从OrderID的Orders
GROUP中选择OrderID,Sum(Cost * Quantity)作为OrderTotal


与其他组一样,选择列表和分组列表必须匹配。在SELECT子句中包含聚合是此规则的例外。

8.总聚集

您可以通过显示每组的分类汇总来进一步汇总数据。SQL的ROLLUP运算符为每个组显示一条附加记录和一个小计。该记录是用聚合函数查找每个组中所有记录的值的结果。以下语句对每个组合的OrderTotal列进行计数。

SELECT客户、订单号、Sum(成本*数量)作为order total
FROM Orders
GROUP BY客户、订单号
WITH ROLLUP


包含两个OrderTotal值20和25的组的汇总行将显示OrderTotal值45。ROLLUP结果的第一个值是yes,因为它查找所有组记录的值。该值是整个记录集的总和。

ROLLUP不支持聚合函数中的DISTINCT或GROUP BY ALL子句。

9.合计每列。

CUBE运算符比ROLLUP更进一步,它返回每个组中每个值的总数。结果类似于ROLLUP,但是多维数据集为组中的每一列都包含一条额外的记录。以下语句显示每个组的小计和每个客户的额外总计。

从Orders
GROUP BY Customer,OrderNumber
WITH CUBE中选择Customer,OrderNumber,Sum(Cost * Quantity)作为OrderTotal


CUBE得到的总和是最复杂的。不仅要进行聚合和汇总,还要查找定义该组的其他列的值。也就是说,多维数据集汇总了所有可能的列组合。

多维数据集不支持GROUP BY ALL。

10.对总数进行排序。

当多维数据集的结果杂乱无章时(通常是这种情况),可以添加一个分组函数,如下所示:

从Orders
GROUP BY Customer,OrderNumber
WITH CUBE中选择GROUPING(Customer),OrderNumber,Sum(Cost * Quantity)作为OrderTotal


结果包括每行的两个附加值。

值为1表示左边的值是总值——ROLLUP或CUBE运算符的结果。

值为0表示左边的值是由原始GROUP BY子句生成的详细记录。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » 数据库中如何分类、分组并总计SQL数据

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情