我先把我的需求 简单说下吧 
就是列变行
DB:
基础信息表
流程ID   流程名
A          原料入库
B          原料化验  
C          生产原料  
D          产品入库
E          产品化验 
F          产品出库 
G          原料称重 
进程表
用户编号 流程ID   序号   时间
1          A       1     12:00
1          B       2     12:10
1          C       3     13:10
1          D       4     14:10
1          E       5     15:10  
1          F       6     16:102          A       1     13:00 
2          B       2     13:00 
2          A       3     13:00 
2          B       4     13:00 
2          C       5     14:10
2          D       6     17:00
2          E       7     14:10
2          F       8     17:00
 
正常的业务流程ID的顺序为A B C D E F 
流程ID可以根据新业务增加 但顺序由序号来决定  假如增加一个流程为G
3          A       1     12:10
3          G       2     14:10 
3          B       3     15:10
3          C       4     16:10
3          D       5     17:10  
3          C       6     18:10
3          D       7     19:10
3          E       8     20:10
3          F       9     21:104          A   1   13:10 
4          G   2    15:10
4     B    3     16:10
4     C    4     17:00
4          E      5      19:00 
4          F      6      20:00UI:
用户编号   A1     G1      B1       A1      B2     C1      D1       C2     D2       E1      F1   
1        12:00           13:10                  14:10     15:10                    16:10  17:10 (正常)
2        13:00           14:00   15:00   16:00  17:00     18:00                    19:00        (B回退A)
3        12:10    14:10  15:10                  16:10     17:10    18:10  19:10    20:10 21:10(增加G流程D回退C
4        13:10    15:10  16:10                  17:00                              19:00  20:00 (无D流程)
经过修改后 进程的顺序为A G B C D E F
由于某种原因肯定会回退到前流程所以就会出现 用户编号为2 3的这种情况
流程排列顺序要从进程表中读取
把语句写死不利于添加新的流程
就是不知道怎么来写这个函数 请帮帮我 谢谢
如有不清楚 请提出 谢谢 解决后一定加分

解决方案 »

  1.   

    这里有个动态行列转换的参考示例:
    /*物料 需要数量 需要仓库 现存量仓库 现存量仓库数量 批次 
    A1 2 C1 C1         20         123 
    A1 2 C1 C2         30         111 
    A1 2 C1 C2         20         222 
    A1 2 C1 C3         10         211 
    A2 3 C4 C1         40         321 
    A2 3 C4 C4         50         222 
    A2 3 C4 C4         60         333 
    A2 3 C4 C5         70         223 
    我需要把上面的查询结果转换为下面的。
    物料 需要数量 需要仓库 C1 C2 C3 C4 C5 
    A1 2 C1 20 50 10 0 0 
    A2 3 C4 40 0 0 110 70 
    */ 
    ------------建表
    CREATE TABLE TEST
    (
    WL VARCHAR2(10),
    XYSL INTEGER,
    XYCK VARCHAR2(10),
    XCLCK VARCHAR2(10),
    XCLCKSL INTEGER,
    PC INTEGER
    );
    ------------ 第一部分测试数据
    INSERT INTO TEST VALUES('A1', 2, 'C1', 'C1' ,        20,         123); 
    INSERT INTO TEST VALUES('A1', 2, 'C1', 'C2' ,        30,         111); 
    INSERT INTO TEST VALUES('A1', 2, 'C1', 'C2' ,        20,         222); 
    INSERT INTO TEST VALUES('A1', 2, 'C1', 'C3' ,        10,         211); 
    INSERT INTO TEST VALUES('A2', 3, 'C4', 'C1' ,        40,         321); 
    INSERT INTO TEST VALUES('A2', 3, 'C4', 'C4' ,        50,         222); 
    INSERT INTO TEST VALUES('A2', 3, 'C4', 'C4' ,        60,         333); 
    INSERT INTO TEST VALUES('A2', 3, 'C4', 'C5' ,        70,         223);
    COMMIT;
    --------------------  动态生成结果表
    DECLARE
      V_SQL VARCHAR2(2000);
      CURSOR CURSOR_1 IS
        SELECT DISTINCT T.XCLCK
          FROM TEST T
         ORDER BY XCLCK; 
    BEGIN
      V_SQL := 'SELECT WL,XYSL,XYCK';  FOR V_XCLCK IN CURSOR_1
      LOOP
        V_SQL := V_SQL || ',' || 'SUM(DECODE(XCLCK,''' || V_XCLCK.XCLCK ||
                 ''',XCLCKSL,0)) AS ' || V_XCLCK.XCLCK;
      END LOOP;
      V_SQL := V_SQL || ' FROM TEST GROUP BY WL,XYSL,XYCK ORDER BY WL,XYSL,XYCK';
      --DBMS_OUTPUT.PUT_LINE(V_SQL);
    V_SQL := 'CREATE TABLE RESULT  AS '||  V_SQL;
    --DBMS_OUTPUT.PUT_LINE(V_SQL);
    EXECUTE IMMEDIATE V_SQL;
    END;
    --------------- 结果
    SELECT * FROM RESULT T;
    WL                                            XYSL XYCK               C1         C2         C3         C4         C5
    ---------- --------------------------------------- ---------- ---------- ---------- ---------- ---------- ----------
    A1                                               2 C1                 20         50         10          0          0
    A2                                               3 C4                 40          0          0        110         70
    --------------- 删除结果表
    DROP TABLE RESULT; 
    ------------ 第二部分测试数据
    INSERT INTO TEST VALUES('A1', 2, 'C1', 'C6' ,        20,         124); 
    INSERT INTO TEST VALUES('A2', 2, 'C1', 'C7' ,        30,         121); 
    INSERT INTO TEST VALUES('A3', 2, 'C1', 'C8' ,        20,         322); 
    COMMIT;---------  从新运行 动态生成结果表 语句块
    --------------- 结果
    SELECT * FROM RESULT T;
    WL     XYSL XYCK          C1       C2         C3         C4         C5         C6         C7         C8
    ----- ----- -------- ------- -------- ---------- ---------- ---------- ---------- ---------- ----------
    A1        2 C1            20       50         10          0          0         20          0          0
    A2        2 C1             0        0          0          0          0          0         30          0
    A2        3 C4            40        0          0        110         70          0          0          0
    A3        2 C1             0        0          0          0          0          0          0         20
    --------------- 删除结果表
    DROP TABLE RESULT; 
      

  2.   

    对你的题意,还不是很清楚,能否把表的数据和你期望的结果是怎样来的,描述的更清楚些,最好用例子来解释。还好,你打算用procedure来解决,要是用sql就没有办法了!
      

  3.   

    基础信息表 
    流程ID  流程名 
    A          原料入库 
    B          原料化验  
    C          生产原料  
    D          产品入库 
    E          产品化验 
    F          产品出库 
    G          原料称重 
    进程表 
    用户编号   流程ID  序号    时间 
    1          A      1    12:00 
    1          B      2    12:10 
    1          C      3    13:10 
    1          D      4    14:10 
    1          E      5    15:10  
    1          F      6    16:10 2          A      1    13:00 
    2          B      2    13:00 
    2          A      3    13:00 
    2          B      4    13:00 
    2          C      5    14:10 
    2          D      6    17:00 
    2          E      7    14:10 
    2          F      8    17:00 3          A      1    12:10 
    3          G      2    14:10 
    3          B      3    15:10 
    3          C      4    16:10 
    3          D      5    17:10  
    3          C      6    18:10 
    3          D      7    19:10 
    3          E      8    20:10 
    3          F      9    21:10 4          A   1  13:10  
    4          G   2   15:10 
    4       B    3    16:10 
    4       C    4    17:00 
    4          E      5    19:00 
    4          F      6    20:00 
    肯定是想用自定义来解决 就是不知道如何下手 请大侠根据我的需求 量身订做下 编译通过立马给分 谢谢了