📜  如何使用 SQL 对数据进行分组和聚合?

📅  最后修改于: 2022-05-13 01:55:43.409000             🧑  作者: Mango

如何使用 SQL 对数据进行分组和聚合?

一个数据库表中可能有很多列,因此有时在这些列中查找相同类型的数据会变得很困难并且需要花费时间。 GROUP BY 语句将表列中存在的相同行分组。 GROUP BY 语句结合 SQL 聚合函数(COUNT()、MAX()、MIN()、SUM()、AVG() 等)帮助我们有效地分析数据。

现在,让我们通过一个例子来理解这一点。

在开始之前,我们必须记住几个重要的点——

  • 所有未作为 GROUP BY 参数列出的数据都需要对其应用聚合函数。



  • 如果您运行此 SQL 命令,那么您将看到一个错误,因为数据库不知道如何处理状态。每组只有一个城市,但有许多州。它们都不能作为没有任何聚合函数的值输出。
  • 我们不能在 GROUP BY 子句之后使用 WHERE 子句。在这种情况下,我们使用 HAVING 子句。

  • 要以特定顺序(升序或降序)显示记录,我们可以使用 ORDER BY 子句。但是没有必要使用它。

句法:

SELECT column1, column2..., 
Aggregate(column3, column4,..) 
FROM Table_name WHERE Condition...
//OPTION-1 (depending on the condition) 
GROUP BY column1,column2,.. HAVING Condition...
//OPTION-2 (depending on the condition) 
ORDER BY column1,column2,.. DESC(if required); 

这里我们使用 Microsoft SQL Server 来执行查询。

步骤 1:创建数据库

为此,请使用以下命令创建名为Sales 的数据库。

询问:

CREATE DATABASE Sales;                                             

步骤 2:使用数据库

使用以下 SQL 语句将数据库上下文切换到 Sales:



询问:

USE Sales;

第 3 步:表定义

我们将在我们的 Sales 数据库中使用以下 Sales_Order 表。

询问:

Create Table Sales_Order
(ORDERNO VARCHAR(20) Primary Key, 
ClientNo VARCHAR(20),
Orderdate DATE,
SALESMANNO VARCHAR(20),
Oredrstatus VARCHAR(30)0;

您可以使用以下语句查询已创建表的描述:

询问:

EXEC SP_COLUMNS Sales_Order;

输出:



第 4 步:向表中添加数据

使用以下语句将数据添加到Sales_Order表:

询问:

INSERT INTO Sales_Order VALUES
('O19001', 'C00001', '2007-10-03', 'S00001', 'In Process'); 
INSERT INTO Sales_Order VALUES('O19002', 'C00002', '2007-11-01', 'S00002', 'Cancelled');
INSERT INTO Sales_Order VALUES('O19003', 'C00003', '2007-9-05', 'S00003', 'Fulfilled');
INSERT INTO Sales_Order VALUES('O19004', 'C00004', '2007-6-06', 'S00004', 'Fulfilled'); 
INSERT INTO Sales_Order VALUES('O19005', 'C00005', '2007-8-02', 'S00005', 'Cancelled');
INSERT INTO Sales_Order VALUES('O19006', 'C00006', '2007-8-01', 'S00006', 'In Process'); 

第五步:查看插入的数据

询问:

SELECT * FROM Sales_Order; 

第 6 步:假设我们要找出订单正在处理的客户的客户编号。

为此,我们将使用COUNT()函数:

询问:

SELECT CLIENTNO, COUNT(ORDERSTATUS)
AS Order_In_Process
from Sales_Order WHERE 
ORDERSTATUS='In Process' GROUP BY CLIENTNO; 

在您的机器上运行此命令并查看输出。



输出:

因此,从这个输出中,我们可以很容易地看出C00001C00006仍有1 个订单In_Process

示例 2:

现在,按照与之前相同的步骤,自行创建另一个名为ORDERED的表。您可以随意指定数据库名称。表的描述将是这样的:

询问:

Create Table Ordered place VARCHAR(30), product VARCHAR(30), price DECIMAL);

现在按以下方式插入数据:

有序表

这次我们想知道从两个地方赚取的总金额。

为此,我们将使用SUM()函数:

询问:

SELECT place, SUM(price) FROM ORDERED GROUP BY place; 

输出:

现在,只需查看输出,我们就可以知道我们从哪个地方赚了更多的钱,而不是逐行查看。

您可以尝试将 AVG()、MIN()、MAX() 聚合函数与 GROUP BY 一起使用,并进行诸如此类的不同类型的查询。