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

如何在SQL中重组指定结构数据表?附预期结果及Pandas疑问

能否用SQL直接实现数据表重组?

原查询SQL

USE DataBase

SELECT * 
FROM table

原数据表

原数据表

重组要求

  • 将Category的元素作为列;
  • Ccy的值取自Str/Num列,取值规则由Value Type决定(s表示取str列的值;n表示取Num列的值)。

预期重组结果

预期结果表

我通常会把表导入Pandas处理,想问能不能直接通过SQL实现这个重组操作?


当然可以用SQL实现,核心思路是行转列(Pivot),结合条件判断选取对应列的值即可。以下是具体实现方案:

实现逻辑

  1. 先用CASE语句根据Value Type确定要取的Ccy值,注意统一数据类型(比如把数字转为字符串,避免列类型冲突);
  2. 再通过行转列操作,将Category的行值转为列名,用聚合函数提取每个分组下的对应值。

针对不同数据库的实现代码

SQL Server(支持原生PIVOT)

USE DataBase;

SELECT 
    ID,
    Name,
    [A] AS A,
    [B] AS B,
    [C] AS C
FROM (
    SELECT 
        ID,
        Name,
        Category,
        CASE 
            WHEN [Value Type] = 's' THEN [Str]
            WHEN [Value Type] = 'n' THEN CAST([Num] AS VARCHAR(50))
        END AS Ccy_Value
    FROM [table]
) AS SourceTable
PIVOT (
    MAX(Ccy_Value)
    FOR Category IN ([A], [B], [C])
) AS PivotTable;

MySQL(无原生PIVOT,用CASE+分组实现)

USE DataBase;

SELECT 
    ID,
    Name,
    MAX(CASE WHEN Category = 'A' THEN 
        CASE WHEN [Value Type] = 's' THEN [Str] ELSE CAST([Num] AS VARCHAR(50)) END 
    END) AS A,
    MAX(CASE WHEN Category = 'B' THEN 
        CASE WHEN [Value Type] = 's' THEN [Str] ELSE CAST([Num] AS VARCHAR(50)) END 
    END) AS B,
    MAX(CASE WHEN Category = 'C' THEN 
        CASE WHEN [Value Type] = 's' THEN [Str] ELSE CAST([Num] AS VARCHAR(50)) END 
    END) AS C
FROM [table]
GROUP BY ID, Name;

注意事项

  • 若Category的取值不固定,可结合动态SQL自动生成列名,具体语法需匹配对应数据库;
  • 必须保证转换后的Ccy值类型统一,否则会出现列类型不兼容的报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 11:40:33