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
jlamorim
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 5
Registrado em: Ter, 26 Fev 2008 7:40 am
Localização: Florianópolis - SC

Bom dia pessoal.
Tenho uma tabela com os sequintes campos

Selecionar tudo

dt_pedido
cd_produto
qt_previsto
qt_pedido
Preciso fazer uma consulta que me retorne mais ou menos isso

Selecionar tudo

________________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

Selecionar tudo

________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
Ricardo Carmo
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 9
Registrado em: Seg, 25 Fev 2008 3:56 pm
Localização: Maceió-AL

Uma pergunta: As datas são fixas?
E a consulta deve retornar sempre duas datas para cada produto?
jlamorim
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 5
Registrado em: Ter, 26 Fev 2008 7:40 am
Localização: Florianópolis - SC

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
Ricardo Carmo
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 9
Registrado em: Seg, 25 Fev 2008 3:56 pm
Localização: Maceió-AL

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:

Selecionar tudo

type CR_CURSOR IS REF CURSOR;
Espero que isso ajude.
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

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

Eu já fiz com um número fixo de colunas. Veja o exemplo nesse link:
http://glufke.net/oracle/viewtopic.php?t=1651
:-o
rogenaro
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Sex, 30 Mar 2007 7:26 pm
Localização: Londrina - PR
Rafael O. Genaro

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

Pivot
Responder
  • Informação
  • Quem está online

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