日期:2014-05-17  浏览次数:20784 次

急急急急急 有些难度的问题 高手赐教 万分感谢
有一个ORACLE表,里面有201列,第一列是时间(datetime),从第2列到201列是温差 格式是temp_1 temp_2 temp_3 一直到temp_200,

共有12898行数据。其中一个时间点对应一条数据。

现在表结构发生了改变,新的表只有三列,时间datetime,房间号room_num(房间号是从1到200),温度差hl_temp,温度差hl_temp的值对应原来表当中温差值。

现在要求 新的表一个时间点对应200条数据了,即分别对应原先表中200个温差的值,

房间号为1的温度差(hl_temp)的值对应原表中temp_1的值,房间号为2的温度差(hl_temp)的值对应原表中temp_2的值,以此类推,房间号为200的的温度差(hl_temp)的值对应原表中temp_200的值。

即原来有 201列,12898行,现在要求转换为 3列 datetime,room_num,hl_temp,12898*200行的表,

请教高手赐教,如何CODE.

万分感谢,高手赐教。



------解决方案--------------------
如果我上述推断为真,那么有2种方法解决这个问题。
方法一:通过手工写SQL来实现,不过这个方法很笨:
SQL code

INSERT INTO NEWTABLE(SELECT 1,DATETIME,temp_1 FROM OLDTABLE );
INSERT INTO NEWTABLE(SELECT 2,DATETIME,temp_2 FROM OLDTABLE );
...
INSERT INTO NEWTABLE(SELECT 200,DATETIME,temp_200 FROM OLDTABLE );

------解决方案--------------------
方法2存储过程的代码,其中TEST表为你的老表,TEST2是你建立的新表
TEST2的建表语句为CREATE TABLE TEST2(DATETIME DATE,ROOM NUMBER,TEMP VARCHAR2(20))
SQL code

--存储过程代码
CREATE OR REPLACE PROCEDURE TEST99 IS 
I INTEGER;
STRTEMP VARCHAR2(20);
STRTEMP1 VARCHAR2(20);
STRSQL VARCHAR2(4000); 
BEGIN
     STRTEMP:='TEMP_';
     I:=1;
     WHILE I<201 LOOP
     BEGIN
     STRTEMP1:=STRTEMP||I;
     STRSQL:='INSERT INTO TEST2(SELECT DATETIME,'||I||','||STRTEMP1||' FROM TEST)';
     EXECUTE IMMEDIATE STRSQL;
     I:=I+1;
     END;
     END LOOP;
     COMMIT;
END;