Ordinary hut

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

          oracle行列轉換

          Posted on 2010-01-07 11:08 landor 閱讀(596) 評論(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





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


          網站導航:
           
          主站蜘蛛池模板: 平乐县| 麦盖提县| 托里县| 陵水| 芒康县| 屯昌县| 禹州市| 龙井市| 屯留县| 陆河县| 高州市| 淳安县| 西丰县| 龙游县| 灵寿县| 漠河县| 阳原县| 文水县| 旬邑县| 梁山县| 岳西县| 上栗县| 加查县| 鄂托克旗| 夏河县| 东方市| 农安县| 公安县| 共和县| 同江市| 孟州市| 广安市| 洪洞县| 南汇区| 浦江县| 辽阳县| 克什克腾旗| 中山市| 乐陵市| 佳木斯市| 交城县|