You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现多列数据逗号拼接的SQL动态Pivot透视查询

动态透视实现多字段拼接输出的T-SQL方案

核心调整逻辑:

  1. 先对LineName+Date做分组聚合,预先生成每个分组对应的单元格拼接值(Production求和结果、Buyer、Style按逗号拼接)
  2. 透视阶段对预生成的单元格值做聚合,替换原仅聚合Production的逻辑
  3. 统一日期格式为ISO标准yyyy-MM-dd,避免不同语言环境下列名不匹配
  4. 动态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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.23 15:06:02