数据表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.   

    a  11g以上版本用pivot
    b  动态拼接sql
    c  自己写自定义函数
      

  2.   


    动态拼接sql
    怎樣寫呢?
      

  3.   

    百度 太多了 动态sql 查询出distinct Course  然后循环拼接
      

  4.   

    SELECT *
      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));
      

  5.   

    wm_cancat 试试这个函数 可以直接拼接
      

  6.   

    只能用存储过程处理了
    ----------------新建测试表
    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;