有三个表A,B,C表A
AID TEST
T1 A1
T2 A2
T2 A3
T2 A4表B
BID A1 A2 A3 A4 A5 A6
1 S1 W1 L1 H1 X1 Z1
2 S2 W2 L2 H2 X2 Z2
3 S3 W3 L3 H3 X3 Z3
4 S4 W4 L4 H4 X4 Z4
5 S5 W5 L5 H5 X5 Z5
6 S6 W6 L6 H6 X6 Z6表C
CID SEQ VALUE
2 1 S1
3 1 W2
3 2 L2
3 3 H2
首先根据条件T1,T2查询A表分别取得值
A1 与A2 A3 A4
再根据这两组值分别查询B表得到六组
S1 S2 S3 S4 S5 S6
与六组
W1 L1 H1
W2 L2 H2
W3 L3 H3
W4 L4 H4
W5 L5 H5
W6 L6 H6
在分别根据查到的值判断C表中是否包含如果包含不操作,不包含在C表中查找CID最大值并插入上面的值CID+1
此例中C表中包含了S1的和W2 L2 H2的数值所以应该插入
4 1 S2,
5 1 S3,
6 1 S4,
7 1 S5,
8 1 S6与
9 1 W1
9 2 L1
9 3 H1
10 1 W3
10 2 L3
10 3 H3
11 1 W4
11 2 L4
11 3 H4
12 1 W5
12 2 L5
12 3 H5
......
需要注意的是A表里面的值是变动的,所以查询出A表的值作为列查询B表也是不固定的。
AID TEST
T1 A1
T2 A2
T2 A3
T2 A4表B
BID A1 A2 A3 A4 A5 A6
1 S1 W1 L1 H1 X1 Z1
2 S2 W2 L2 H2 X2 Z2
3 S3 W3 L3 H3 X3 Z3
4 S4 W4 L4 H4 X4 Z4
5 S5 W5 L5 H5 X5 Z5
6 S6 W6 L6 H6 X6 Z6表C
CID SEQ VALUE
2 1 S1
3 1 W2
3 2 L2
3 3 H2
首先根据条件T1,T2查询A表分别取得值
A1 与A2 A3 A4
再根据这两组值分别查询B表得到六组
S1 S2 S3 S4 S5 S6
与六组
W1 L1 H1
W2 L2 H2
W3 L3 H3
W4 L4 H4
W5 L5 H5
W6 L6 H6
在分别根据查到的值判断C表中是否包含如果包含不操作,不包含在C表中查找CID最大值并插入上面的值CID+1
此例中C表中包含了S1的和W2 L2 H2的数值所以应该插入
4 1 S2,
5 1 S3,
6 1 S4,
7 1 S5,
8 1 S6与
9 1 W1
9 2 L1
9 3 H1
10 1 W3
10 2 L3
10 3 H3
11 1 W4
11 2 L4
11 3 H4
12 1 W5
12 2 L5
12 3 H5
......
需要注意的是A表里面的值是变动的,所以查询出A表的值作为列查询B表也是不固定的。
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;
for la in (select Test from A where AID in ('T1','T2'))
v_sql:=' merge into C
using (select '||la.test||' value from B
on (c.VALUE=B.value)
when matched then
update cid=cid+1
when not matched then
insert values(cid,value);';
执行动态SQL;
end loop;