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
V_SQL := V_SQL
[解决办法]
','
[解决办法]
'MAX(DECODE(Course,'''
[解决办法]
V_XCLCK.Course
[解决办法]
''',''Y'',''N'')) AS '
[解决办法]
V_XCLCK.Course;
END LOOP;
V_SQL := V_SQL
[解决办法]
' FROM tmp_user_2 GROUP BY student_id';
--DBMS_OUTPUT.PUT_LINE(V_SQL);
V_SQL := 'CREATE OR REPLACE VIEW tmp_user_3 AS '
[解决办法]
V_SQL;
--DBMS_OUTPUT.PUT_LINE(V_SQL);
EXECUTE IMMEDIATE V_SQL;
END;
----------------执行存储过程
BEGIN
P_tmp_user_2;
END;
----------------查看结果
SELECT * FROM tmp_user_3;
----------------第二部分测试数据
INSERT INTO tmp_user_2 VALUES(3, '物理');
INSERT INTO tmp_user_2 VALUES(2, '语文');
COMMIT;
----------------执行存储过程
BEGIN
P_tmp_user_2;
END;
----------------查看结果
SELECT * FROM tmp_user_3;
