如何用SQL将各CompanyId下的交易价格按DealId并排展示?
行转列(Pivot)实现方案
你需要的是将同一CompanyId下不同DealId的价格从行转换为列,这是典型的SQL行转列操作,以下是两种通用实现方式:
方法1:条件聚合(兼容多数数据库)
这种方式适用于MySQL、PostgreSQL等不支持原生PIVOT语法的数据库,通过CASE WHEN结合聚合函数实现:
SELECT ROW_NUMBER() OVER (ORDER BY CompanyId) AS id, CompanyId AS companyId, MAX(CASE WHEN DealId = 1 THEN price END) AS DealName1, MAX(CASE WHEN DealId = 2 THEN price END) AS DealName2, MAX(CASE WHEN DealId = 3 THEN price END) AS DealName3 FROM your_table_name GROUP BY CompanyId ORDER BY CompanyId;
关键说明:
ROW_NUMBER()用于生成结果中的自增id(若原表已有按公司分组的唯一id,可替换为对应字段)CASE WHEN匹配每个DealId,提取对应价格;MAX确保每个CompanyId仅返回一行数据- 若某公司无对应
DealId的记录,对应列会返回NULL,可使用COALESCE(..., 'value')替换为默认值
方法2:PIVOT函数(适用于SQL Server/Oracle等)
如果你的数据库支持原生PIVOT语法,可使用更简洁的写法:
SELECT ROW_NUMBER() OVER (ORDER BY CompanyId) AS id, companyId, DealName1, DealName2, DealName3 FROM (SELECT CompanyId, DealId, price FROM your_table_name) AS source PIVOT (MAX(price) FOR DealId IN ([1] AS DealName1, [2] AS DealName2, [3] AS DealName3)) AS pivot_table ORDER BY companyId;
关键说明:
- 子查询先提取需要的核心字段,再通过PIVOT将
DealId的不同值转换为列 - 聚合函数
MAX用于确保每个CompanyId+DealId组合仅返回一条数据
注意事项:
- 替换
your_table_name为你实际的表名 - 若
DealId数量不固定(可能新增),需使用动态SQL生成列,具体语法因数据库而异
内容的提问来源于stack exchange,提问作者Cenk
相关产品推荐
相关产品推荐

