当我对 GROUP BY 列表中的列名以及“WITH ROLLUP”修饰符使用显式排序顺序「ASC 或 DESC」时,会对摘要输出产生什么影响?

介绍

在 SQL 查询语言中,GROUP BY 子句可用于将行分组为汇总行,它将针对每个组执行聚合函数,并可选择为每个组添加一个摘要行。当然, GROUP BY 子句可以与 ORDER BY 子句结合使用,以按升序或降序对组条目进行排序。在本文中,我们将讨论 GROUP BY 子句,明确其列表中的列名和 WITH ROLLUP 修饰符的排序顺序(ASC 或 DESC)如何影响其摘要输出。

什么是 GROUP BY?

在 SQL 中,GROUP BY 子句是按照列名或表达式创建汇总行的子句。可以在通过选择列中的唯一值,或者在通过使用操作符,表达式或函数从列中派生不同的值的情况下创建这些汇总行。可以使用各种聚合函数(如 SUM,COUNT,AVG)在列上运行,以汇总组或结果集的值。

为了理解 GROUP BY,我们可以看一下下面的示例:

假设我们有一个客户订单表。 该表列出了日期,产品,订单数量,单价和订单总价。

以下是数据的示例表:

CREATE TABLE orders (

order_date DATE,

product VARCHAR(100),

quantity INT,

price DECIMAL(5,2),

total DECIMAL(8,2)

);

INSERT INTO orders (order_date, product, quantity, price, total) VALUES

('2020-01-01', 'product A', 5, 10.00, 50.00),

('2020-01-02', 'product B', 3, 15.00, 45.00),

('2020-01-03', 'product C', 2, 20.00, 40.00),

('2020-01-03', 'product A', 6, 10.00, 60.00),

('2020-01-04', 'product B', 1, 15.00, 15.00),

('2020-01-05', 'product B', 4, 15.00, 60.00);

现在我们想要根据日期对数据进行汇总。 我们可以使用以下查询:

SELECT order_date, SUM(quantity), SUM(total)

FROM orders

GROUP BY order_date;

这将返回以下结果:

+------------+--------------+--------------+

| order_date | SUM(quantity)| SUM(total) |

+------------+--------------+--------------+

| 2020-01-01 | 5 | 50.00 |

| 2020-01-02 | 3 | 45.00 |

| 2020-01-03 | 8 | 100.00 |

| 2020-01-04 | 1 | 15.00 |

| 2020-01-05 | 4 | 60.00 |

+------------+--------------+--------------+

如您所见,这个查询按照日期对订单表进行了分组,并对每个组中的总数量和总金额进行了汇总。

这是一个简单的示例。 实际使用中,可以创建包含多个表和列的查询,如 JOIN,WHERE,HAVING等。

使用 ORDER BY 子句

ORDER BY 子句用于按指定方式对查询结果进行排序。 它支持升序和降序排序,并且可用于任何 SELECT 查询。 我们可以将其与 GROUP BY 子句结合使用,以按升序或降序对组条目进行排序。

以下是用于按 order_date 汇总和排序的查询:

SELECT order_date, SUM(quantity), SUM(total)

FROM orders

GROUP BY order_date

ORDER BY order_date DESC;

此查询返回以下结果:

+------------+--------------+--------------+

| order_date | SUM(quantity)| SUM(total) |

+------------+--------------+--------------+

| 2020-01-05 | 4 | 60.00 |

| 2020-01-04 | 1 | 15.00 |

| 2020-01-03 | 8 | 100.00 |

| 2020-01-02 | 3 | 45.00 |

| 2020-01-01 | 5 | 50.00 |

+------------+--------------+--------------+

在上面的查询中,使用了 ORDER BY 子句来按照 order_date 列的降序对结果进行排序。 这样,从最近的日期到最早的日期对结果进行排序。

使用 WITH ROLLUP 子句

WITH ROLLUP 用于扩展 GROUP BY 查询并添加总行。 它默认在查询的末尾执行汇总,并将在每个组的末尾添加一个总行。

以下是示例查询:

SELECT order_date, product, SUM(quantity), SUM(total)

FROM orders

GROUP BY order_date, product

WITH ROLLUP;

此查询将返回以下结果:

+------------+-------------+--------------+--------------+

| order_date | product | qty_sum | total_sum |

+------------+-------------+--------------+--------------+

| 2020-01-01 | product A | 5 | 50.00 |

| 2020-01-02 | product B | 3 | 45.00 |

| 2020-01-03 | product C | 2 | 40.00 |

| 2020-01-03 | product A | 6 | 60.00 |

| 2020-01-04 | product B | 1 | 15.00 |

| 2020-01-05 | product B | 4 | 60.00 |

| NULL | NULL | 21 | 270.00 |

+------------+-------------+--------------+--------------+

在上面的查询中,使用 GROUP BY 向查询添加了两个列,以按日期和产品进行分组,并根据这些组中的订单数量和总金额汇总了查询结果。 使用 WITH ROLLUP 向结果添加了一个汇总行,其中包含所有分组的总计。

使用 ORDER BY 和 WITH ROLLUP

现在,我们来看看在 GROUP BY 列表中的列名和 WITH ROLLUP 修饰符的排序顺序如何影响其摘要输出。

以下是示例查询:

SELECT order_date, product, SUM(quantity), SUM(total)

FROM orders

GROUP BY order_date, product

WITH ROLLUP

ORDER BY order_date DESC, product ASC;

此查询将返回以下结果:

+------------+-------------+--------------+--------------+

| order_date | product | qty_sum | total_sum |

+------------+-------------+--------------+--------------+

| 2020-01-05 | product B | 4 | 60.00 |

| 2020-01-04 | product B | 1 | 15.00 |

| 2020-01-03 | product A | 6 | 60.00 |

| 2020-01-03 | product C | 2 | 40.00 |

| 2020-01-02 | product B | 3 | 45.00 |

| 2020-01-01 | product A | 5 | 50.00 |

| NULL | NULL | 21 | 270.00 |

+------------+-------------+--------------+--------------+

在上面的查询中,ORDER BY 子句按照 order_date 逆序排序,然后按照 product 字母顺序排序。 GROUP BY 子句按照 order_date 和 product 列分组,使用 ROLLUP 汇总,在每个组的结尾附加一个总行。

需要注意的是,当使用 WITH ROLLUP 时,ORDER BY 子句的顺序很重要。 它将影响最终的摘要行。

总结

在 SQL 查询语言中,GROUP BY 子句可用于将行分组为汇总行,它将针对每个组执行聚合函数,并可选择为每个组添加一个摘要行。可以将 ORDER BY 子句与 GROUP BY 子句结合使用以按升序或降序对组条目进行排序。使用 WITH ROLLUP 修饰符可向结果添加一个汇总行,其中包含所有分组的总计。在使用 ORDER BY 和 WITH ROLLUP 时,子句的顺序很重要,这将影响最终的摘要输出。

最后,我们提醒使用者,了解 GROUP BY 子句及其使用方式,有助于 SQL 查询和数据分析,从而为数据处理提供更大的灵活性和控制。

免责声明:本文来自互联网,本站所有信息(包括但不限于文字、视频、音频、数据及图表),不保证该信息的准确性、真实性、完整性、有效性、及时性、原创性等,版权归属于原作者,如无意侵犯媒体或个人知识产权,请来电或致函告之,本站将在第一时间处理。猿码集站发布此文目的在于促进信息交流,此文观点与本站立场无关,不承担任何责任。

数据库标签