SQLSERVER 中的 ListAGG

作者:编程家 分类: sqlserver 时间:2025-12-18

SQLSERVER 中的 ListAGG 函数介绍

在 SQLSERVER 中,ListAGG 函数是一种聚合函数,用于将多行数据按照指定的分隔符连接成一个字符串。这个函数可以在处理某些特定的业务场景时非常有用,例如将一个表的多个字段合并成一个字段,或者将多个行的数据合并成一个字段。

使用 ListAGG 函数的语法

ListAGG 函数的语法如下:

ListAGG (expression, delimiter) WITHIN GROUP (ORDER BY column)

其中,expression 是要连接的字段或表达式,delimiter 是分隔符,column 是用于排序的列名。

使用 ListAGG 函数的示例

假设我们有一个员工表,其中包含员工的姓名和所在部门。我们希望将每个部门的员工姓名连接成一个字符串,并用逗号分隔。

首先,创建一个名为 employees 的表,并插入一些数据:

sql

CREATE TABLE employees (

id INT,

name VARCHAR(50),

department VARCHAR(50)

);

INSERT INTO employees (id, name, department)

VALUES (1, 'John', 'HR'),

(2, 'Alice', 'HR'),

(3, 'Bob', 'IT'),

(4, 'Emily', 'IT'),

(5, 'Michael', 'IT');

接下来,使用 ListAGG 函数将每个部门的员工姓名连接成一个字符串,并用逗号分隔:

sql

SELECT department, ListAGG(name, ', ') WITHIN GROUP (ORDER BY name) AS employees

FROM employees

GROUP BY department;

运行以上代码,将会得到以下结果:

department | employees

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

HR | Alice, John

IT | Bob, Emily, Michael

使用 ListAGG 函数将多个字段合并

除了将多个行的数据合并成一个字段外,ListAGG 函数还可以将一个表的多个字段合并成一个字段。下面是一个示例:

假设我们有一个订单表,其中包含订单号、商品名称和数量。我们希望将每个订单的商品名称和数量合并成一个字段,并用逗号分隔。

首先,创建一个名为 orders 的表,并插入一些数据:

sql

CREATE TABLE orders (

order_number INT,

product_name VARCHAR(50),

quantity INT

);

INSERT INTO orders (order_number, product_name, quantity)

VALUES (1, 'Apple', 5),

(1, 'Orange', 3),

(2, 'Banana', 2),

(2, 'Grapes', 4),

(2, 'Watermelon', 1);

接下来,使用 ListAGG 函数将每个订单的商品名称和数量合并成一个字段,并用逗号分隔:

sql

SELECT order_number, ListAGG(product_name || ' (' || quantity || ')', ', ') WITHIN GROUP (ORDER BY order_number) AS products

FROM orders

GROUP BY order_number;

运行以上代码,将会得到以下结果:

order_number | products

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

1 | Apple (5), Orange (3)

2 | Banana (2), Grapes (4), Watermelon (1)

使用 ListAGG 函数的注意事项

在使用 ListAGG 函数时,需要注意以下几点:

1. ListAGG 函数只能用于 SQLSERVER 11g 及以上版本。

2. ListAGG 函数的排序顺序由 WITHIN GROUP (ORDER BY column) 子句指定。

3. 如果要连接的字段中包含 NULL 值,ListAGG 函数会忽略这些 NULL 值。

通过使用 SQLSERVER 中的 ListAGG 函数,我们可以很方便地将多行数据按照指定的分隔符连接成一个字符串。无论是将多个行的数据合并成一个字段,还是将一个表的多个字段合并成一个字段,ListAGG 函数都能够帮助我们轻松实现这些需求。

参考代码

sql

-- 示例1:将每个部门的员工姓名连接成一个字符串

CREATE TABLE employees (

id INT,

name VARCHAR(50),

department VARCHAR(50)

);

INSERT INTO employees (id, name, department)

VALUES (1, 'John', 'HR'),

(2, 'Alice', 'HR'),

(3, 'Bob', 'IT'),

(4, 'Emily', 'IT'),

(5, 'Michael', 'IT');

SELECT department, ListAGG(name, ', ') WITHIN GROUP (ORDER BY name) AS employees

FROM employees

GROUP BY department;

-- 示例2:将每个订单的商品名称和数量合并成一个字段

CREATE TABLE orders (

order_number INT,

product_name VARCHAR(50),

quantity INT

);

INSERT INTO orders (order_number, product_name, quantity)

VALUES (1, 'Apple', 5),

(1, 'Orange', 3),

(2, 'Banana', 2),

(2, 'Grapes', 4),

(2, 'Watermelon', 1);

SELECT order_number, ListAGG(product_name || ' (' || quantity || ')', ', ') WITHIN GROUP (ORDER BY order_number) AS products

FROM orders

GROUP BY order_number;

以上就是关于 SQLSERVER 中的 ListAGG 函数的介绍和示例代码。希望本文能够帮助读者理解和使用 ListAGG 函数。