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

合并与转置表:如何编写SQL实现指定数据格式转换?

SQL行转列查询求助

数据集结构与示例数据

表结构

  • Customer表
字段说明
ID客户ID
Name客户姓名
  • Detail表
字段说明
ID详情ID
Name详情类型(如sex、age)
  • DataValues表
字段说明
CustomerID关联客户ID
DetailID关联详情ID
Values详情对应的值

示例数据

  • Customer表数据
IDName
1Jack
2Anne
  • Detail表数据
IDName
1sex
2age
  • DataValues表数据
CustomerIDDetailIDValues
11M
1230
21F
2228

期望查询结果

NameSexAge
JackM30
AnneF28

尝试的SQL语句

select Customers.Name, Details.Name, DataValues.Value from Customers
inner join DataValues on DataValues.CustomersID = Customers.ID 
inner join Details on DataValues.DetailsID = Details.ID

解决方案

你的原SQL返回的是每行对应一个客户的单个属性值,要将属性转成列展示,需要用条件聚合(适配多数数据库)或数据库原生的PIVOT功能,以下是具体实现:

通用条件聚合写法

SELECT 
    c.Name,
    MAX(CASE WHEN d.Name = 'sex' THEN dv.Values END) AS Sex,
    MAX(CASE WHEN d.Name = 'age' THEN dv.Values END) AS Age
FROM Customer c
JOIN DataValues dv ON c.ID = dv.CustomerID
JOIN Detail d ON dv.DetailID = d.ID
GROUP BY c.ID, c.Name;
  • 用CASE语句匹配详情类型,提取对应属性值
  • 用MAX聚合(因每个客户每个属性仅一个值,MIN也可),将同一客户的多行数据合并为一行
  • 按客户ID和姓名分组,保证每个客户仅返回一行

支持PIVOT的数据库写法(如SQL Server)

SELECT Name, sex AS Sex, age AS Age
FROM (
    SELECT c.Name, d.Name AS DetailName, dv.Values
    FROM Customer c
    JOIN DataValues dv ON c.ID = dv.CustomerID
    JOIN Detail d ON dv.DetailID = d.ID
) AS SourceTable
PIVOT (
    MAX(Values)
    FOR DetailName IN (sex, age)
) AS PivotTable;

内容的提问来源于stack exchange,提问作者mehmet baki

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 05:50:37