brow, o que me veio à cabeça no momento foi a criação de duas funções:
status_produto: retorna o valor do campo qt_previsto ou qt_pedido para um dado produto num dia especifico, dependendo da variável p_tipo;
minha_consulta: retorna os dados que você deseja, restringindo as datas a um intervalo fornecido. Quanto à performance, a mesma pode deixar a desejar, faça um teste, talvez você possa melhorar esse código.
Um detalhe: o cabeçalho, com os valores das datas, fica por sua conta ok?
A primeira função:
Selecionar tudo
FUNCTION status_produto (
p_cd_produto IN NUMBER,
p_dat VARCHAR2,
p_tipo IN NUMBER
)
RETURN NUMBER IS
p_quant NUMBER;
BEGIN
SELECT NVL (DECODE (p_tipo, 0, qt_previsto, qt_pedido), 0)
INTO p_quant
FROM tabela
WHERE cd_produto = p_cd_produto
AND TRUNC (dt_pedido) = TO_DATE (p_dat, 'dd/mm/yyyy');
RETURN p_quant;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RETURN 0;
END;
A função principal:
Selecionar tudo
FUNCTION minha_consulta (dat_inicial IN DATE, dat_final IN DATE)
RETURN CR_CURSOR IS
cmd VARCHAR2 (20000);
dat DATE;
p_cursor cr_cursor;
BEGIN
cmd := 'select cd_produto';
dat := TRUNC (dat_inicial);
WHILE dat <= TRUNC (dat_final) LOOP
cmd :=
cmd
|| ', status_produto(cd_produto,'''
|| TO_CHAR (dat, 'dd/mm/yyyy')
|| ''',0)'
|| ', status_produto(cd_produto,'''
|| TO_CHAR (dat, 'dd/mm/yyyy')
|| ''',1)';
dat := dat + 1;
END LOOP;
cmd:=cmd||' from tabela';
OPEN vcr_cursor FOR cmd;
RETURN vcr_cursor;
END;
Sim, CR_CURSOR é um cursor genérico:
Espero que isso ajude.