据我了解,01-OCT-2009 到 31-OCT-2009 只有代码x、y和z,而到 30-NOV-2009 也可能会产生w。
最终,您需要这样的查询:
CREATE TABLE t1 AS
SELECT
abc.date,
MAX(DECODE(code, 'x', val_1, NULL)) AS abc_val_1_x,
MAX(DECODE(code, 'x', val_2, NULL)) AS abc_val_2_x,
MAX(DECODE(code, 'x', val_3, NULL)) AS abc_val_3_x,
MAX(DECODE(code, 'y', val_1, NULL)) AS abc_val_1_y,
MAX(DECODE(code, 'y', val_2, NULL)) AS abc_val_2_y,
MAX(DECODE(code, 'y', val_3, NULL)) AS abc_val_3_y,
...
FROM data.abc
WHERE abc.date BETWEEN '01-OCT-2009' AND '31-OCT-2009'
GROUP BY abc.date
我不是 Oracle 人员,也无权在 Oracle 上进行测试,因此您可能会在下面发现不少语法错误等。您还需要将硬编码日期更改为变量,声明一些变量并实际运行创建的查询。
-- Figure out all valid codes for date range.
-- Might also require ordering depending on your report.
CURSOR c1
IS
SELECT
abc.code
FROM data.abc
WHERE abc.date BETWEEN '01-OCT-2009' AND '31-OCT-2009'
GROUP BY abc.code;
query1 := 'CREATE TABLE abc_report AS SELECT date';
LOOP
FETCH c1 INTO code1
EXIT WHEN c1%NOTFOUND;
query1 := query1 || ', DECODE(code, ''' || code1 || ''', val_1, NULL)) AS abc_val_1_' || code1 ||
', DECODE(code, ''' || code1 || ''', val_2, NULL)) AS abc_val_2_' || code1 ||
', DECODE(code, ''' || code1 || ''', val_3, NULL)) AS abc_val_3_' || code1
END LOOP;
query1 := query1 || ' FROM data.abc WHERE date BETWEEN ''01-OCT-2009'' AND ''31-OCT-2009'''