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

如何将行聚合至新列?合并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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 11:50:22