Consulta Hierarquica - Matriz em SQL

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
  

Mensagemem Ter, 26 Fev 2008 7:48 am

Bom dia pessoal.
Tenho uma tabela com os sequintes campos
dt_pedido
cd_produto
qt_previsto
qt_pedido

Preciso fazer uma consulta que me retorne mais ou menos isso

________________dt_pedido___________dt_pedido
cd_produto___qt_previsto qt_pedido___qt_previsto qt_pedido
cd_produto___qt_previsto qt_pedido___qt_previsto qt_pedido

Exemplo

________26/02/2008____27/02/2008
132______35___150_______110 200
456_______3____15________20 25

Tento usar a consulta hierarquica com level e connect by, mas não chego nem perto de algo coerente.

Se alguém puder me ajudar eu agradeço bastante.

Obrigado
João Luís Amorim
jlamorim
Localização: Florianópolis - SC

Mensagemem Ter, 26 Fev 2008 9:27 am

Uma pergunta: As datas são fixas?
E a consulta deve retornar sempre duas datas para cada produto?
Ricardo Carmo
Localização: Maceió-AL

Mensagemem Ter, 26 Fev 2008 10:32 am

Bom dia.
As datas não são fixas. São os dias que tem pedidos, acontece de alguma dia não ter nenhum pedido.
A consulta pode retornar várias datas por produto. Eu poderia ver todos os pedidos de uma semana, quinzena, etc.

Obrigado
jlamorim
Localização: Florianópolis - SC

Mensagemem Ter, 26 Fev 2008 11:56 am

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:

Código: Selecionar todos
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:

Código: Selecionar todos
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:

type CR_CURSOR IS REF CURSOR;

Espero que isso ajude.
Ricardo Carmo
Localização: Maceió-AL

Mensagemem Ter, 26 Fev 2008 3:54 pm

Eu já fiz com um número fixo de colunas. Veja o exemplo nesse link:
http://glufke.net/oracle/viewtopic.php?t=1651
:-o
dr_gori
Localização: Portland, OR USA

Thomas F. G

Você já respondeu a dúvida de alguém hoje?
http://glufke.net/oracle/search.php?search_id=unanswered

Mensagemem Ter, 26 Fev 2008 7:08 pm

Ai vai uma dica pra quem está na versão 11g (ou superior =P)

Pivot
rogenaro
Localização: Londrina - PR

Rafael O. Genaro


  • Veja também
    Respostas
    ExibiÇões
    Última mensagem


          Voltar para SQL

          Quem está online

          Usuários navegando neste fórum: Nenhum usuário registrado e 4 visitantes