如何在SQL中重组指定结构数据表?附预期结果及Pandas疑问
能否用SQL直接实现数据表重组?
原查询SQL
USE DataBase SELECT * FROM table
原数据表

重组要求
- 将
Category的元素作为列; Ccy的值取自Str/Num列,取值规则由Value Type决定(s表示取str列的值;n表示取Num列的值)。
预期重组结果

我通常会把表导入Pandas处理,想问能不能直接通过SQL实现这个重组操作?
当然可以用SQL实现,核心思路是行转列(Pivot),结合条件判断选取对应列的值即可。以下是具体实现方案:
实现逻辑
- 先用
CASE语句根据Value Type确定要取的Ccy值,注意统一数据类型(比如把数字转为字符串,避免列类型冲突); - 再通过行转列操作,将
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
相关产品推荐
相关产品推荐

