日期:2014-05-17  浏览次数:21035 次

Sql动态列转行
数据表A,表示每个学生的课程表

student_id      Course
1                语文
1                数学
2                英语
3                语文
3                英语


现在要查询显示成这样(学生有该课程的就为Y,否则为N)

student_id    语文     数学    英语
1              Y         Y       N
2              N         N       Y
3              Y         N       Y

上面的课程只有3个,事实上课程是不固定的,会增加的.

------解决方案--------------------
a  11g以上版本用pivot
b  动态拼接sql
c  自己写自定义函数
------解决方案--------------------
只能用存储过程处理了
----------------新建测试表
CREATE TABLE tmp_user_2(student_id NUMBER,Course VARCHAR2(100));

----------------第一部分测试数据
INSERT INTO tmp_user_2 VALUES(1, '语文'); 
INSERT INTO tmp_user_2 VALUES(1, '数学');
INSERT INTO tmp_user_2 VALUES(2, '英语');
INSERT INTO tmp_user_2 VALUES(3, '语文');
INSERT INTO tmp_user_2 VALUES(3, '英语');
COMMIT;

----------------行转动态列存储过程
CREATE OR REPLACE PROCEDURE P_tmp_user_2 IS
  V_SQL VARCHAR2(2000);
  CURSOR CURSOR_1 IS
    SELECT DISTINCT T.Course FROM tmp_user_2 T ORDER BY Course;

BEGIN
  V_SQL := 'SELECT student_id';
  FOR V_XCLCK IN CURSOR_1 LOOP