DB:
张三 语文 90
张三 数学 80
张三 英语 70
李四 语文 89
李四 历史 78
UI:
      语文 数学 英语 历史
张三  90    80   70
李四  89             78
科目不是要动态的从数据库中读取 如果有地理这门的话也要在UI上显示

解决方案 »

  1.   

    用union all拼sql语句或用decode来实现
      

  2.   

    SELECT tt.cname,
           SUM(decode(tt.ccode, '语文', tt.cccount, NULL)),
           SUM(decode(tt.ccode, '数学', tt.cccount, NULL)),
           SUM(decode(tt.ccode, '英语', tt.cccount, NULL)),
           SUM(decode(tt.ccode, '历史', tt.cccount, NULL))
      FROM test3 tt
     GROUP BY tt.cname
      

  3.   

    oracle  有个 pivotgoogel "oracle pivot" 就可找到例子
      

  4.   

    顶,建议你去参考视图user_tab_columns,这里有decode的详细例子,是行变列
      

  5.   

    pivot这个是ORACLE 11G才有的新特性!
      

  6.   

    给个示例给楼主
    /*物料 需要数量 需要仓库 现存量仓库 现存量仓库数量 批次 
    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;