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
代码说明
- CTE部分(AttributeGroups):通过
GROUP BY按属性名称和GUID分组,用STRING_AGG把同一个属性的多个值用逗号拼接起来,得到类似color: red,blue的单个属性条目。 - 最终查询:再次使用
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
相关产品推荐
相关产品推荐

