SQL Server动态PIVOT查询:行转列实现方案咨询
SQL Server 动态行转列实现方案
要实现将行数据转为指定列数据,核心是利用SQL Server的PIVOT运算符结合动态SQL自动识别所有需要转换的属性列,避免硬编码列名。以下是具体实现:
动态SQL查询语句
DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX); -- 生成需要转为列的属性名称(结合Attribute_section命名,避免同属性跨分类冲突) SELECT @cols = STUFF((SELECT DISTINCT ',' + QUOTENAME(CONCAT(Attribute_section, '_', Attribute)) FROM YourTableName FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)'), 1, 1, ''); -- 构造动态PIVOT查询 SET @query = N'SELECT Firstname, Lastname, ' + @cols + N' FROM ( SELECT Firstname, Lastname, CONCAT(Attribute_section, ''_'', Attribute) AS AttributeFullName, Attribute_value FROM YourTableName ) AS SourceData PIVOT ( MAX(Attribute_value) FOR AttributeFullName IN (' + @cols + N') ) AS PivotTable;'; -- 执行动态SQL EXEC sp_executesql @query;
关键说明
- 替换
YourTableName为实际表名。 - 若不需要按分类区分属性,可将
CONCAT(Attribute_section, '_', Attribute)改为直接使用Attribute,生成的列名就是属性本身。 QUOTENAME函数用于处理属性名称中的特殊字符(如空格、特殊符号),保证列名合法。MAX(Attribute_value)作为聚合逻辑,若同一用户同一属性有多行数据,会取最新/最后一条的值;若确保每个用户每个属性仅一行数据,使用MIN/AVG等聚合函数效果一致。
内容的提问来源于stack exchange,提问作者Shan
相关产品推荐
相关产品推荐

