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

如何将SQL中分类行转置为列并填充NA值?

考试数据转置并填充缺失值的解决方案

1. SQL 实现

通用写法(适配多数数据库)

通过GROUP BY结合CASE WHEN与COALESCE函数,将Test列的分类转为独立列,并为缺失记录填充na:

SELECT 
    Student,
    COALESCE(MAX(CASE WHEN Test = 'T1' THEN Grade END), 'na') AS T1,
    COALESCE(MAX(CASE WHEN Test = 'T2' THEN Grade END), 'na') AS T2,
    COALESCE(MAX(CASE WHEN Test = 'T3' THEN Grade END), 'na') AS T3
FROM 
    your_table_name  -- 替换为你的实际表名
GROUP BY 
    Student;

PostgreSQL 专用写法(使用crosstab函数)

PostgreSQL支持crosstab函数实现快速转置,需先启用tablefunc扩展:

-- 启用扩展(仅需执行一次)
CREATE EXTENSION IF NOT EXISTS tablefunc;

-- 转置并填充缺失值
SELECT 
    Student,
    COALESCE(T1, 'na') AS T1,
    COALESCE(T2, 'na') AS T2,
    COALESCE(T3, 'na') AS T3
FROM crosstab(
    'SELECT Student, Test, Grade FROM your_table_name ORDER BY 1,2',
    'SELECT unnest(ARRAY[''T1'', ''T2'', ''T3''])'
) AS ct(Student text, T1 text, T2 text, T3 text);

2. Python Pandas 实现

利用pivot_table完成转置,再通过fillna填充缺失值:

import pandas as pd

# 读取你的数据(示例为构造数据,实际可通过pd.read_sql/pd.read_csv读取)
data = {
    'Student': ['St1', 'St1', 'St2', 'St2', 'St3'],
    'Test': ['T1', 'T2', 'T2', 'T3', 'T3'],
    'Grade': ['A', 'B', 'B', 'C', 'B']
}
df = pd.DataFrame(data)

# 转置操作
pivoted_df = df.pivot_table(
    index='Student',
    columns='Test',
    values='Grade',
    aggfunc='first'  # 确保每个学生对应每个考试仅保留一个成绩
).reset_index()

# 清理列名并填充缺失值
pivoted_df.columns.name = None
pivoted_df = pivoted_df.fillna('na')

# 输出结果
print(pivoted_df)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 08:23:55