MSSQL 从多行合成单行的简单操作

介绍

在MSSQL中,将多行合成到一行中是一个很常见的需求,特别是当我们需要显示概要视图时,多行的数据不太适合用户浏览。我们可以利用T-SQL的一些函数帮助我们实现这个需求,确保我们只返回一行数据。

Concat函数

Concat函数将一列拼接成单个字符串。该函数接受多个参数并自动在它们之间添加分隔符。如果有空值的话,可以使用 ISNULL 或 COALESCE 函数将其替换为字符串。

语法

CONCAT ( string_value1, string_value2 [, string_valueN ] )

示例

SELECT CONCAT(RTRIM(LastName), ', ', RTRIM(FirstName)) AS Name FROM Employees;

在这里,我们将每个员工的FirstName和LastName列合并到一个Name列中,以逗号和一个空格作为分隔符。

字符串聚合函数(STUFF和FOR XML PATH)

STUFF函数允许我们删除从一个字符串开始的指定长度字符,并插入另一个字符串。FOR XML PATH方式将查询结果作为XML返回。在此过程中,我们可以使用 STUFF 函数来替换XML标记。

语法

STUFF( character_expression , start , length , replaceWith_expression )

示例

SELECT STUFF((SELECT ', ' + RTRIM(LastName)

FROM Employees

FOR XML PATH ('')), 1, 2, '') AS Employees

FROM Employees;

在这里,我们将每个员工的LastName合并到一个字符串中,并在逗号和一个空格之间添加一个前缀。最后,我们使用 STUFF 函数删除该前缀并将其替换为空字符串。

Pivot表达式

Pivot表达式将行转换为列并允许我们为每个列定义新名称和聚合函数。

语法

SELECT column_list

FROM table_expression

PIVOT (aggregate_function(column_to_aggregate)

FOR column_to_pivot

IN ( column_list ))

示例

SELECT *

FROM ( SELECT Name, Value FROM Table1 ) as s

PIVOT (SUM(Value) FOR Name IN (Column1, Column2, Column3)) AS pvt;

在这里,我们使用 PIVOT 块来将每个 Name 列值旋转到新的列中,并使用 SUM 函数对每个值求和。

反转行

UNPIVOT表达式将列转换为行,从而更容易执行聚合操作。

语法

SELECT *

FROM table_expression

UNPIVOT (value FOR column_name IN (column_list)) AS unpvt

示例

SELECT *

FROM ( SELECT VisualStudio, Eclipse, IntelliJ

FROM Table2 ) p

UNPIVOT ( DeploymentPackage FOR ApplicationName IN (VisualStudio, Eclipse, IntelliJ) ) AS unpvt;

在这里,我们使用UNPIVOT 块来将形如 VisualStudio, Eclipse, IntelliJ 的列名称转换成新的应用程序名列,并将其中的DeploymentPackage列值合并到一个叫做value的列中。

合并数据

我们可以使用 UNION 和 UNION ALL 运算符将两个或更多的查询组合在一起,并返回一个结果集,其中包含所有查询的行。如果我们希望允许某些重复记录,请使用 UNION ALL 而不是 UNION。

语法

SELECT column_list

FROM table1

UNION[ALL]

SELECT column_list

FROM table2

示例

SELECT *

FROM Employees_Table_1

UNION ALL

SELECT *

FROM Employees_Table_2

在这里,我们将两个Employees表合并成一个表。

结论

使用这些MSSQL功能,将多行数据合并到单行中变得轻而易举,这有助于提高查询性能和用户体验。合并所有相关数据是具有挑战性的,但这些技术可以帮助您完成任务。

数据库标签