数据表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个,事实上课程是不固定的,会增加的.
1 语文
1 数学
2 英语
3 语文
3 英语
现在要查询显示成这样(学生有该课程的就为Y,否则为N)student_id 语文 数学 英语
1 Y Y N
2 N N Y
3 Y N Y上面的课程只有3个,事实上课程是不固定的,会增加的.
b 动态拼接sql
c 自己写自定义函数
动态拼接sql
怎樣寫呢?
FROM (SELECT DEPTNO, JOB, SAL FROM SCOTT.EMP) PIVOT(SUM(SAL) FOR DEPTNO IN(10,
20,
30,
40));SELECT *
FROM SCOTT.EMP PIVOT (SUM(SAL) AS LL FOR DEPTNO IN ('10'));SELECT *
FROM EMP PIVOT XML(SUM(SAL) AS SALARIES FOR DEPTNO IN (SELECT DEPTNO
FROM DEPT));
----------------新建测试表
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;