如何实现多列数据逗号拼接的SQL动态Pivot透视查询
动态透视实现多字段拼接输出的T-SQL方案
核心调整逻辑:
- 先对
LineName+Date做分组聚合,预先生成每个分组对应的单元格拼接值(Production求和结果、Buyer、Style按逗号拼接) - 透视阶段对预生成的单元格值做聚合,替换原仅聚合Production的逻辑
- 统一日期格式为ISO标准
yyyy-MM-dd,避免不同语言环境下列名不匹配 - 动态SQL变量类型改为
NVARCHAR(MAX),适配多日期场景下的字符串长度需求
完整可执行代码:
DECLARE @query NVARCHAR(MAX) ,@Dates NVARCHAR(MAX) -- 动态生成标准格式的日期列名,按日期升序排列 ;WITH DistinctDates AS ( SELECT DISTINCT CONVERT(DATE, [Date]) AS DateVal FROM Table_17M ) SELECT @Dates = STUFF(( SELECT '],[' + CONVERT(VARCHAR(10), DateVal, 23) FROM DistinctDates ORDER BY DateVal ASC FOR XML PATH('') ), 1, 2, '') + ']' -- 构建动态透视SQL SET @query = N' ;With PivotData As ( Select LineName, -- 行维度 CONVERT(VARCHAR(10), [Date], 23) AS DateStr, -- 列维度,统一为标准日期字符串 -- 拼接单元格值:Production总和 + Buyer + Style CAST(SUM(Production) AS VARCHAR(20)) + '','' + MAX(Buyer) + '','' + MAX(Style) AS cell_value From Table_17M -- 按生产线、日期分组,确保每个分组仅一行 Group By LineName, CONVERT(VARCHAR(10), [Date], 23) ) Select * From PivotData -- 对预拼接的单元格值做聚合(每组仅一行,MAX直接取该值即可) Pivot (Max(cell_value) For [DateStr] In (' + @Dates + ')) As P; ' EXEC sp_executesql @query;
注意事项:
- 若同生产线同日期下存在多个不同的Buyer/Style,需将代码中
MAX(Buyer)、MAX(Style)替换为STRING_AGG(DISTINCT Buyer, ';')、STRING_AGG(DISTINCT Style, ';')(适用于SQL Server 2017及以上版本),实现多值拼接 - 若Production/Buyer/Style存在NULL值,拼接时会导致整个单元格结果为NULL,可通过
ISNULL()包裹对应字段处理,例如:CAST(SUM(ISNULL(Production,0)) AS VARCHAR(20)) + ',' + ISNULL(MAX(Buyer),'') + ',' + ISNULL(MAX(Style),'') - 无匹配数据的分组会自动返回NULL,符合需求预期
内容的提问来源于stack exchange,提问作者Rafiqul Islam Parvez
相关产品推荐
相关产品推荐

