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

SQL Server基于公共列合并行的实现需求及查询调整

实现SQL Server中按公共列合并行属性的解决方案

你现在需要把数据表中相同属性的行合并成类似color: red,blue size:34的格式,我来帮你修改现有的SQL代码,实现这个需求。

首先先看你当前的查询代码:

Declare @Attributes TABLE ( Varient Varchar(20), AllAttributes VARCHAR(MAX), GUID Varchar(50) ) 
INSERT INTO @Attributes 
select PV.Varient_Name,PVV.Varient_Value,PA.GUID 
FROM tblproductattribute PA 
INNER JOIN Product_Varients PV ON PV.Id = PA.AttributeID 
INNER JOIN Product_Varient_Value PVV ON PVV.Id = PA.AttributeValue 
WHERE PA.GUID='2C2E23A5-AF08-4DC0-98A7-035EE6E7A06D' 
--and PA.AttributeID = 1 
Select * from @Attributes 

这段代码只是把数据临时存到表变量里,但还没做合并。要实现按属性名称(Varient)合并对应的值,再把所有属性组合成目标格式,我们可以用STRING_AGG函数(SQL Server 2017及以上版本支持)来完成:

修改后的完整代码

-- 先获取分组后的属性与对应值列表
WITH AttributeGroups AS (
    SELECT 
        PV.Varient_Name AS AttributeName,
        STRING_AGG(PVV.Varient_Value, ',') AS AttributeValues,
        PA.GUID
    FROM tblproductattribute PA 
    INNER JOIN Product_Varients PV ON PV.Id = PA.AttributeID 
    INNER JOIN Product_Varient_Value PVV ON PVV.Id = PA.AttributeValue 
    WHERE PA.GUID='2C2E23A5-AF08-4DC0-98A7-035EE6E7A06D'
    GROUP BY PV.Varient_Name, PA.GUID
)
-- 再把所有属性组合成目标格式
SELECT 
    GUID,
    STRING_AGG(CONCAT(AttributeName, ': ', AttributeValues), ' ') AS CombinedAttributes
FROM AttributeGroups
GROUP BY GUID

代码说明

  1. CTE部分(AttributeGroups):通过GROUP BY按属性名称和GUID分组,用STRING_AGG把同一个属性的多个值用逗号拼接起来,得到类似color: red,blue的单个属性条目。
  2. 最终查询:再次使用STRING_AGG,把所有属性条目用空格拼接,得到你需要的color: red,blue size:34这种完整格式。

如果你的SQL Server版本低于2017,不支持STRING_AGG,可以用FOR XML PATH的方式来实现拼接:

兼容低版本SQL Server的代码

-- 分组拼接单个属性的值
WITH AttributeGroups AS (
    SELECT 
        PV.Varient_Name AS AttributeName,
        STUFF((
            SELECT ',' + PVV2.Varient_Value
            FROM tblproductattribute PA2
            INNER JOIN Product_Varient_Value PVV2 ON PVV2.Id = PA2.AttributeValue
            WHERE PA2.GUID = PA.GUID AND PA2.AttributeID = PV.Id
            FOR XML PATH(''), TYPE
        ).value('.', 'VARCHAR(MAX)'), 1, 1, '') AS AttributeValues,
        PA.GUID
    FROM tblproductattribute PA 
    INNER JOIN Product_Varients PV ON PV.Id = PA.AttributeID 
    WHERE PA.GUID='2C2E23A5-AF08-4DC0-98A7-035EE6E7A06D'
    GROUP BY PV.Varient_Name, PA.GUID
)
-- 拼接所有属性
SELECT 
    GUID,
    STUFF((
        SELECT ' ' + CONCAT(AttributeName, ': ', AttributeValues)
        FROM AttributeGroups AG2
        WHERE AG2.GUID = AG.GUID
        FOR XML PATH(''), TYPE
    ).value('.', 'VARCHAR(MAX)'), 1, 1, '') AS CombinedAttributes
FROM AttributeGroups AG
GROUP BY GUID

这段代码用FOR XML PATH来模拟字符串聚合的效果,先处理单个属性的多值拼接,再把所有属性组合起来。

内容的提问来源于stack exchange,提问作者Milan Gajjar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:57:32