Ordinary hut

          人間一福地,勝似天仙宮
          posts - 61, comments - 50, trackbacks - 0, articles - 1

          oracle行列轉換

          Posted on 2010-01-07 11:08 landor 閱讀(601) 評論(0)  編輯  收藏 所屬分類: oracle
          oracle 10g之后,可以用wm_concat函數來做
          但是這個是把多行匯總到一個字段中,如果是多個動態字段,可以根據這個帖子來做

          以下轉自http://blog.163.com/benthos@126/blog/static/127943815200910189508556/

          /*物料 需要數量 需要倉庫 現存量倉庫 現存量倉庫數量 批次

          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

          */

          ---------------------------------------------------------------建表

          ----------------判斷表是否存在

          declare num number;

          begin

              select count(1) into num from user_tables where table_name='TEST';

              if num>0 then

                execute immediate 'drop table TEST';

              end if;

          end;

          ----------------建表

          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;

          --select * from test;

          ---------------------------------------------------------------行轉列的存儲過程

          CREATE OR REPLACE PROCEDURE P_TEST IS

            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 OR REPLACE VIEW RESULT  AS '||  V_SQL;

                --DBMS_OUTPUT.PUT_LINE(V_SQL);

                EXECUTE IMMEDIATE V_SQL;

              END;

          ----------------------------------------------------------------結果

          ----------------執行存儲過程,生成視圖

          BEGIN

            P_TEST;              

          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

          ----------------第二部分測試數據

          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;

          ----------------報告存儲過程,生成視圖

          BEGIN

            P_TEST;              

          END;

          ----------------結果

          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 VIEW RESULT;

          DROP PROCEDURE P_TEST;

          DROP TABLE TEST;  

          0

          0

          0





          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 连城县| 田东县| 宜黄县| 延津县| 义马市| 固镇县| 景东| 邓州市| 靖安县| 外汇| 江陵县| 容城县| 太和县| 黄龙县| 普兰店市| 西林县| 红河县| 乐东| 鄂伦春自治旗| 麻阳| 台南县| 天气| 聂拉木县| 南投市| 阳东县| 遂川县| 晋城| 视频| 宾阳县| 阿城市| 日喀则市| 天等县| 寿宁县| 雅安市| 平和县| 出国| 新河县| 宁陵县| 嘉义市| 开化县| 绍兴县|