如何将行聚合至新列?合并Product与ProductProperties表获目标结果
关联Product与ProductProperties表并转换结果格式的实现方案
通常这类需求是要把ProductProperties中的属性行转成列,和Product表关联后得到扁平化的结果,下面提供两种常用实现方式:
方法一:使用CASE WHEN(通用兼容方案)
这种方式适配所有支持SQL的数据库,兼容性最强。假设你的表结构如下:
Product表:包含ProductID、ProductName等核心字段ProductProperties表:包含ProductID、PropertyName、PropertyValue字段
示例SQL代码:
SELECT p.ProductID, p.ProductName, MAX(CASE WHEN pp.PropertyName = 'Color' THEN pp.PropertyValue END) AS Color, MAX(CASE WHEN pp.PropertyName = 'Size' THEN pp.PropertyValue END) AS Size, MAX(CASE WHEN pp.PropertyName = 'Weight' THEN pp.PropertyValue END) AS Weight -- 可根据实际属性继续添加更多CASE语句 FROM Product p LEFT JOIN ProductProperties pp ON p.ProductID = pp.ProductID GROUP BY p.ProductID, p.ProductName;
说明:通过CASE WHEN匹配指定属性名,提取对应属性值,再用MAX聚合函数将同一产品的多行属性合并为一行,最后按产品唯一标识分组。
方法二:使用PIVOT函数(部分数据库支持)
如果你的数据库支持PIVOT语法(比如SQL Server、Oracle、PostgreSQL 11+等),可以用更简洁的写法:
以SQL Server为例的示例代码:
SELECT * FROM ( SELECT p.ProductID, p.ProductName, pp.PropertyName, pp.PropertyValue FROM Product p LEFT JOIN ProductProperties pp ON p.ProductID = pp.ProductID ) AS SourceTable PIVOT ( MAX(PropertyValue) FOR PropertyName IN ([Color], [Size], [Weight]) -- IN列表需包含所有需要转成列的属性名 ) AS PivotTable;
说明:先通过子查询关联两张表得到基础数据集,再用PIVOT函数将PropertyName的不同值转为列,用MAX聚合处理同一属性的重复值。
若属性名是动态的(无法提前确定所有属性),则需要结合数据库的动态SQL功能实现,比如SQL Server的EXEC、Oracle的EXECUTE IMMEDIATE等。
内容的提问来源于stack exchange,提问作者Hassen Gaaya
相关产品推荐
相关产品推荐

