行列转换

yufeiyxl 2005-09-29 04:50:52
假如我有一张表table1,他有40列,60行数据,我想建另一张表table2,他有60列,40行,把table1的行列转换后的结果放到table2中,请问如何实现?请指教
...全文
323 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
yufeiyxl 2005-10-17
  • 打赏
  • 举报
回复
谢谢各位兄弟了,小弟现在结贴。
DF_4B 2005-09-30
  • 打赏
  • 举报
回复
▲多维数组(表)
声明PL/SQL表的语法如下:
TYPE PL/SQL表名 IS TABLE OF 数据类型 INDEX BY BINARY_INTEGER;
/*下面的例子变换一个表的行与列*/
DECLARE
TYPE phoneNum IS RECORD (
phone_no VARCHAR(13) NOT NULL DEFAULT '----',
city_code VARCHAR(4) NOT NULL DEFAULT '----',
city_name VARCHAR(8) NOT NULL DEFAULT '----',
state VARCHAR(6) NOT NULL DEFAULT '----',
type VARCHAR(6) NOT NULL DEFAULT '----'
); /*声明记录类型数据*/
TYPE emp_type_array IS TABLE OF phoneNum INDEX BY BINARY_INTEGER;/*声明多维数组*/
selPart emp_type_array; /*声明多维数组变量*/
loopCount INTEGER;
colTotal INTEGER:=5; /*总计列数*/

CURSOR curSel IS /*声明游标*/
SELECT phone_no,city_code,city_name,state,type
FROM tb_phone_no
WHERE phone_no in ('1333241','1339414','1334237','1333222','1332230');

BEGIN
loopCount:=0;
OPEN curSel; /*打开游标*/
FETCH curSel INTO selPart(loopCount); /*从游标中检索数据行*/
WHILE curSel%FOUND LOOP /*当不再能找到数据时,终止查询*/
loopCount:=loopCount+1;
FETCH curSel INTO selPart(loopCount);
END LOOP;
CLOSE curSel; /*关闭游标*/

DBMS_OUTPUT.PUT_LINE('正常显示:');
FOR loopCount IN 0..selPart.count-1 LOOP
DBMS_OUTPUT.PUT_LINE(selPart(loopCount).phone_no ||
' ' || selPart(loopCount).city_code ||
' ' || selPart(loopCount).city_name ||
' ' || selPart(loopCount).state ||
' ' || selPart(loopCount).type);
END LOOP;
DBMS_OUTPUT.PUT_LINE('------------------------------------------------');
DBMS_OUTPUT.PUT_LINE('行列转换:');

FOR loopCount IN 0..colTotal-1 LOOP
DBMS_OUTPUT.PUT(selPart(loopCount).phone_no || ' ');
END LOOP;
DBMS_OUTPUT.PUT_LINE('');
FOR loopCount IN 0..colTotal-1 LOOP
DBMS_OUTPUT.PUT(selPart(loopCount).city_code || ' ');
END LOOP;
DBMS_OUTPUT.PUT_LINE('');
FOR loopCount IN 0..colTotal-1 LOOP
DBMS_OUTPUT.PUT(selPart(loopCount).city_name || ' ');
END LOOP;
DBMS_OUTPUT.PUT_LINE('');
FOR loopCount IN 0..colTotal-1 LOOP
DBMS_OUTPUT.PUT(selPart(loopCount).state || ' ');
END LOOP;
DBMS_OUTPUT.PUT_LINE('');
FOR loopCount IN 0..colTotal-1 LOOP
DBMS_OUTPUT.PUT(selPart(loopCount).type || ' ');
END LOOP;
DBMS_OUTPUT.PUT_LINE('');
END;
/*运行示例*/
SQL> @d:\temp\oracle.sql
61 /
正常显示:
1332230 0417 营口 辽宁 CDMA
1333222 0411 大连 辽宁 CDMA
1334237 0427 盘锦 辽宁 CDMA
1339414 0414 本溪 辽宁 CDMA
1333241 024 沈阳 辽宁 CDMA
------------------------------------------------
行列转换:
1332230 1333222 1334237 1339414 1333241
0417 0411 0427 0414 024
营口 大连 盘锦 本溪 沈阳
辽宁 辽宁 辽宁 辽宁 辽宁
CDMA CDMA CDMA CDMA CDMA

PL/SQL 过程已成功完成。
gfyhlq 2005-09-30
  • 打赏
  • 举报
回复
参考一下:
原表(oldtable)字段:
MONTH 月份
SHUI 用电值
DIAN 用水值
YOU 用油值
MEI 用煤值
QI 用汽值

新表(newtable)字段:
NAME 名称
NUM1 1月用量
NUM2 2月用量
NUM3 3月用量
NUM4 4月用量
NUM5 5月用量
NUM6 6月用量
NUM7 7月用量
NUM8 8月用量
NUM9 9月用量
NUM10 10月用量
NUM11 11月用量
NUM12 12月用量


-------------------------------------

CREATE OR REPLACE PROCEDURE "NYGL"."CC" (
ckind VARCHAR2
)
as

tyb newtable%ROWTYPE; --对应要插入的新表
vcou --原表的字段数,不包括月份

BEGIN
vcou:=5;

DECLARE
--定义动态光标
TYPE TotalCurTyp IS REF CURSOR;
shuju TotalCurTyp;


--记录集(存储单条查询结果)
TYPE tmp111 IS TABLE OF VARCHAR(20) INDEX BY BINARY_INTEGER;
TYPE tmp2 IS RECORD ( zhi tmp111 );
vtab tmp2;

--单维数组
TYPE arr2 IS TABLE OF tmp2 INDEX BY BINARY_INTEGER;
vary arr2;

BEGIN

--数组初始化
FOR i IN 0..vcou LOOP
vtab.zhi(i):=0;
END LOOP;
FOR i IN 1..12 LOOP
vary(i):=vtab;
END LOOP;


OPEN shuju FOR

SELECT substrb(to_char(MONTH,'yyyy-mm-dd'),6,2),
Sum(SHUI),Sum(DIAN),Sum(YOU),Sum(MEI),Sum(QI)
FROM oldtable GROUP BY substrb(to_char(MONTH,'yyyy-mm-dd'),6,2);

LOOP
FETCH shuju INTO vtab.zhi(0),vtab.zhi(1),vtab.zhi(2),vtab.zhi(3),vtab.zhi(4),vtab.zhi(5);
vary(vtab.zhi(0)):=vtab;
EXIT WHEN shuju%NOTFOUND;
END LOOP;

CLOSE shuju;




--转换数据,并循环存入新表中
FOR a IN 1..vcou Loop

tyb.NUM1:=vary(1).zhi(a);
tyb.NUM2:=vary(2).zhi(a);
tyb.NUM3:=vary(3).zhi(a);
tyb.NUM4:=vary(4).zhi(a);
tyb.NUM5:=vary(5).zhi(a);
tyb.NUM6:=vary(6).zhi(a);
tyb.NUM7:=vary(7).zhi(a);
tyb.NUM8:=vary(8).zhi(a);
tyb.NUM9:=vary(9).zhi(a);
tyb.NUM10:=vary(10).zhi(a);
tyb.NUM11:=vary(11).zhi(a);
tyb.NUM12:=vary(12).zhi(a);

INSERT INTO newtable VALUES(tyb.NUM1,tyb.NUM2,tyb.NUM3,tyb.NUM4,tyb.NUM5,tyb.NUM6,tyb.NUM7,
tyb.NUM8,tyb.NUM9,tyb.NUM10,tyb.NUM11,tyb.NUM12);

END LOOP;

COMMIT;

END;
END;
yufeiyxl 2005-09-30
  • 打赏
  • 举报
回复
谢谢 waterfirer(水清) ,不过看上去很麻烦啊!
waterfirer 2005-09-29
  • 打赏
  • 举报
回复
觉得和
http://community.csdn.net/Expert/topic/4301/4301014.xml?temp=.1354486
是一样的。试试上面的方法吧

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧