处理数据的人都知道,对数据进行分组可能很麻烦。如果您正在使用电子表格或其他工具来对各种数据进行分组,请阅读本教程并学习如何使用SQL更轻松地完成工作。我们将致力于营销样本数据。您是否曾经遇到过需要分析数据并以不同于存储数据的形式呈现结果的情况?在本教程中,您将了解在对SQL中的数据进行分组时,SQL对有效的数据操作有多大帮助。

  问题

  情境

您在全球范围内的数字有影响力营销机构工作。该机构在世界各地都有分支机构,CMO已决定进行促销计划活动。该计划是在每个地点举办一个论坛,有许多影响者参加。

每个有影响力的人都有一个经理,经理在活动期间照顾有影响力的人,提供信息并处理解决方案。一位经理一次只能照顾一位影响者。拥有不只一位影响者的管理者将必须聘请一名活动助理。

  已要求您提供以下信息:

每个位置的影响者数量(以确定事件的规模)

每个位置的每个经理的影响者数量(以检查必须招聘多少活动助理)

此信息内部存储在代理商的SQL数据库中,该数据库包含一个表格,其中包含有关影响者的数据。

您的工作是分析存储在影响者表中的数据,并将所需信息提供给CMO。

  样本数据表

下表命名为 influencer 并包含您将在整个教程中使用的示例数据。

为了以图形方式显示分组过程,您必须按位置和impacter_manager对样本数据进行排序。的influencer
表数据将用作解释SQL中数据分组过程的起点。

让我们从以下查询开始:

SELECT *

FROM influencer

ORDER BY location, influencer_manager

现在 influencer 表格看起来像这样:

如您所见,表中的数据按升序排序,首先是按位置,然后是有影响力的经理。

  什么是SQL GROUP BY子句?

CMO定义的任务都需要数据分组。在SQL中,数据分组使用GROUP BY 条款。

SQL GROUP
BY允许您根据定义的条件对数据进行分组。您可以按一个或多个表列对单个数据进行分组。要正确进行分组,您通常需要将汇总函数应用于“SELECT 声明。

  GROUP BY子句的语法

的语法 GROUP BY 子句如下:

SELECT count(column_name1), column_name2, column_name3, … ,

FROM table_name

WHERE condition

GROUP BY column_name2, column_name3, … ,

ORDER BY column_name2, column_name3, … ,

在语法方面,请务必记住GROUP BY子句在SELECT语句中的位置。始终在FROM和/或WHERE子句之后和ORDER
BY子句之前如果存在编写GROUP BY语句。

如您所见,要使用 GROUP BY子句,您需要了解SQL查询数据的基础。如果您想重新学习这些基础知识,请看一些在线课程。

有很多Internet资源可以学习SQL,例如Udemy,Coursera和edX,但是它们通常缺乏交互性,对于初学者来说可能太过挑战。

我建议您从一开始就可以获得实践代码编写经验的站点,例如Vertabelo Academy的SQL Basics。

您会惊讶于通过练习可以进步多快!

如果您已经熟悉基本的写作 SELECT语句,学习如何在SQL中对数据进行分组将是小菜一碟。让我们看看如何GROUP BY 在实践中可行!

SQL GROUP BY示例

现在该解决场景中提出的任务了。首先,您必须编写一个基本的GROUP BY查询。之后,您将通过一个稍微复杂的示例来查看如何对多个表列进行分组。

  任务1:获取每个位置的影响者数量

查询:

SELECT location, count(location) as number_of_influencers

FROM influencer

GROUP BY location

ORDER BY location

让我们仔细看看构建以上查询的过程:

1.选择位置列。我们将使用此列将您的数据分组。

SELECT location

FROM influencer

2.通过将COUNT函数应用到表列之一中,将另一列添加到SELECT语句中,以获取影响者数量。

由于使用COUNT函数对表行进行计数,因此将其应用于哪个表列都没有关系。

SELECT location, count(location) as number_of_influencers

FROM influencer

3.如果没有GROUP BY子句,则先前的查询将不起作用,因为它包含聚合函数。因此,插入GROUP
BY子句,然后使用location列进行分组。

由于该列包含五个不同的值,因此最终查询结果将具有五行。

SELECT location, count(location) as number_of_influencers

FROM influencer

GROUP BY location

下表显示了如何进行分组:根据位置列中的不同值对数据进行分组,其中每个绘制的矩形均包含特定位置的数据。换句话说,每个矩形代表一个数据组。

COUNT函数将计算每个组中的行数,并返回某个位置中有影响力的人数。

4.应用 ORDER BY 位置列上的子句可根据该列中的值以升序对最终查询结果进行排序。

SELECT location, count(location) as number_of_influencers

FROM influencer

GROUP BY location

ORDER BY location

查询结果:

  任务2:获取每个地点每个经理的影响者数量

让我们验证一下经理是否必须为该论坛雇用助手。

查询:

SELECT influencer_manager, location, count(influencer_name) as
number_of_influencers

FROM influencer

GROUP BY influencer_manager, location,

ORDER BY influencer_manager

现在,我们将仔细研究构建以上查询的过程:

1.SELECT 的 influencer_manager 和 location列; 您将使用这些列将数据分组。

SELECT influencer_manager, location,

FROM influencer

2.与前面的示例一样,通过将COUNT函数应用于表列之一来向SELECT语句添加另一列(以获取每个管理者的影响者数)。

SELECT influencer_manager, location, count(influencer_name) as
number_of_influencers

FROM influencer

3.同样,如果没有GROUP BY子句,则上一步中的查询将不起作用,因为它包含聚合函数。现在,您应该将GROUP
BY子句同时应用于Impactr_manager和location列。

因此,首先,您需要按经理对数据进行分组。接下来,您可以按位置对这些经理进行分组,从而有效地在位置组中创建经理子组。

SELECT influencer_manager, location, count(influencer_name) as
number_of_influencers

FROM influencer

GROUP BY influencer_manager, location

的 COUNT 函数将计算每个组的子组中的行,并返回每个位置的每个管理员的影响者数量。

4.在influencer_manager列上应用ORDER BY子句,以按经理的姓名升序对查询结果进行排序。

SELECT influencer_manager, location, count(influencer_manager) as
number_of_influencers

FROM influencer

GROUP BY influencer_manager, location

ORDER BY influencer_manager

查询结果:

如您所见,有些经理拥有不只一名本地影响者,有些经理则拥有来自世界各地的影响者。

有了这些知识,我们现在可以例如为必须决定只参加一个活动地点的招聘经理助理或现场经理计划预算。想了解更多关于SQL数据库的信息,请继续关注。