pgsql列转行sql函数
在数据库查询过程中,有时候会遇到将列转行的需求。比如有一张表存储了学生每门课程的成绩,数据结构如下:
学生ID | 语文成绩 | 数学成绩 | 英语成绩 |
---|---|---|---|
1 | 80 | 90 | 85 |
2 | 75 | 85 | 90 |
3 | 90 | 95 | 80 |
现在需要将每个学生的每门课程成绩转为行的形式,数据结构如下:
学生ID | 课程 | 成绩 |
---|---|---|
1 | 语文 | 80 |
1 | 数学 | 90 |
1 | 英语 | 85 |
2 | 语文 | 75 |
2 | 数学 | 85 |
2 | 英语 | 90 |
3 | 语文 | 90 |
3 | 数学 | 95 |
3 | 英语 | 80 |
在PostgreSQL数据库中,可以编写一个函数来实现列转行的功能。下面是一个示例的pgSQL函数:
CREATE OR REPLACE FUNCTION unpivot_table(table_name VARCHAR)
RETURNS TABLE(student_id INT, subject VARCHAR, score INT) AS DECLARE
sql_query VARCHAR;
BEGIN
sql_query := 'SELECT student_id, ''语文'' AS subject, 语文成绩 AS score FROM ' || table_name ||
' UNION ALL ' ||
'SELECT student_id, ''数学'' AS subject, 数学成绩 AS score FROM ' || table_name ||
' UNION ALL ' ||
'SELECT student_id, ''英语'' AS subject, 英语成绩 AS score FROM ' || table_name;
RETURN QUERY EXECUTE sql_query;
END; LANGUAGE plpgsql;
上面的函数接受一个表名作为参数,然后动态生成SQL语句进行列转行操作。通过使用UNION ALL将每个学生的成绩转换为行的形式,返回一个结果集。
下面是调用该函数的示例:
SELECT * FROM unpivot_table('student_scores');
运行上述示例代码,将会得到期望的结果,即将列转行后的数据。
通过编写类似上面的pgSQL函数,可以方便地实现列转行的功能,在某些情况下能够简化数据库查询操作。