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

如何在SQLite中无需显式列名将单行表转置为键值对形式?

在SQLite中动态转置表格(不硬编码列名)

SQLite没有原生的UNPIVOT函数,但可以通过动态生成SQL的方式实现不指定列名的转置,步骤如下:

1. 获取目标表的列名

先通过PRAGMA table_info获取表的所有列名,这是最可靠的方式:

PRAGMA table_info('task_times'); -- 替换成你的实际表名

执行后会返回包含列名的结果集,列名存储在name字段中。

2. 生成转置SQL

基于获取到的列名,拼接出UNION ALL形式的查询语句,每个列对应一行数据:

SELECT 'SELECT ''' || name || ''' AS Task, ' || name || ' AS Time FROM task_times UNION ALL '
FROM pragma_table_info('task_times'); -- 替换表名

执行这段SQL会输出类似以下的语句片段:

SELECT 'Housing' AS Task, Housing AS Time FROM task_times UNION ALL
SELECT 'Furniture' AS Task, Furniture AS Time FROM task_times UNION ALL
SELECT 'YardWork' AS Task, YardWork AS Time FROM task_times

手动去掉最后一行末尾的UNION ALL,执行最终的SQL即可得到转置后的结果。

3. 程序中自动实现(以Python为例)

如果需要在代码中自动完成整个流程,可以通过客户端代码拼接SQL:

import sqlite3

# 连接数据库
conn = sqlite3.connect('your_database.db')
cursor = conn.cursor()

# 获取表的列名
cursor.execute("PRAGMA table_info('task_times')")
column_names = [row[1] for row in cursor.fetchall()]

# 拼接转置SQL
sql_segments = [f"SELECT '{col}' AS Task, {col} AS Time FROM task_times" for col in column_names]
final_sql = " UNION ALL ".join(sql_segments)

# 执行查询并输出结果
cursor.execute(final_sql)
transposed_data = cursor.fetchall()

# 打印格式化结果
print("| Task      | Time  |")
print("|-----------|-------|")
for task, time in transposed_data:
    print(f"| {task:<10} | {time:<5} |")

# 关闭连接
conn.close()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 13:17:32