Página 1 de 1

select complicada

Enviado: Qua, 26 Dez 2007 5:18 pm
por marquesjr
Pessoal, pesquisando a origem de uma visão, encontrei no banco a seguinte select:

Como não tenho muito conhecimento, não consegui enterder a estrutura dessa seleção, minha dúvida é essa;

Já tentei de diversas forma adicionar mais um join, que seria a descrição do produto (campo ds_produto da tabela produto), eu achava que bastava adicionar o join na penúltima e última FROM/WHERE, mas não deu certo, em qual select teria que adicionar o join?

Outra dúvida é qual o objetivo desse select com Null td_contagem e 0 hr_contagem?

Selecionar tudo

Select Copia_Estoque.Cd_Contagem
     , Null          dt_contagem
     , Null          hr_contagem
     , Null          dt_geracao
     , Null          hr_geracao
     , Copia_Estoque.cd_produto
     , 0 qt_estoque
     , 0 qt_estoque_doado
     , 0 vl_custo_medio

Selecionar tudo

Select Saldo_Atual.cd_contagem
     , Saldo_Atual.dt_contagem
     , Saldo_Atual.hr_contagem
     , Saldo_Atual.dt_geracao
     , Saldo_Atual.hr_geracao
     , Saldo_Atual.cd_produto
     , Saldo_Atual.Qt_estoque
     , Saldo_Atual.Qt_estoque_doado
     , Saldo_Atual.vl_custo_medio
     , Nvl(Saldo_Anterior.qt_anterior, 0) Qt_Anterior
     , Nvl(Saldo_Anterior.qt_anterior_doado, 0) Qt_Anteior_Doado
     , Saldo_Atual.ds_unidade
  From (
Select contagem.cd_contagem
     , contagem.dt_contagem
     , contagem.hr_contagem
     , contagem.dt_geracao
     , contagem.hr_geracao
     , itcontagem.cd_produto
     , Sum(itcontagem.qt_estoque * uni_pro.vl_Fator) qt_estoque
     , Sum(itcontagem.qt_estoque_doado * uni_pro.vl_fator) qt_estoque_doado
     , avg(itcontagem.vl_custo_medio / uni_pro.vl_fator ) vl_custo_medio
     , 0 qt_anterior
     , 0 qt_anterior_doado
     , uni_pro.ds_unidade
  From Dbamv.Contagem
     , Dbamv.ItContagem
     , Dbamv.Uni_Pro
 Where Contagem.Cd_Contagem = ItContagem.Cd_Contagem
   And ItContagem.Cd_Uni_Pro = Uni_Pro.Cd_Uni_Pro
Group By Contagem.Cd_Contagem
       , contagem.Dt_Contagem
       , contagem.Hr_Contagem
       , contagem.Dt_Geracao
       , contagem.Hr_Geracao
       , itcontagem.Cd_Produto
       , Uni_Pro.Ds_Unidade
       ) Saldo_Atual
     , (
Select Copia_Estoque.Cd_Contagem
     , Null          dt_contagem
     , Null          hr_contagem
     , Null          dt_geracao
     , Null          hr_geracao
     , Copia_Estoque.cd_produto
     , 0 qt_estoque
     , 0 qt_estoque_doado
     , 0 vl_custo_medio
     , Sum(Copia_Estoque.Qt_Estoque) qt_anterior
     , Sum(Copia_Estoque.Qt_Estoque_Doado) qt_anterior_doado
     , Null  ds_unidade
  From Dbamv.Copia_Estoque
Group By Copia_Estoque.Cd_Contagem
       , Copia_Estoque.cd_produto
       ) Saldo_Anterior
Where Saldo_Atual.Cd_Contagem = Saldo_Anterior.Cd_Contagem(+)
  And Saldo_Atual.Cd_Produto = Saldo_Anterior.Cd_Produto(+)

Enviado: Qui, 27 Dez 2007 7:06 am
por Trevisolli
Brother,

Para se adicionar a descrição do produto, você deve fornecer a tabela de produtos (no teu FROM, através de uma JOIN).
Como não conhecemos tua base, não deu pra saber qual delas e, se ela está no teu select.

Quanto ao valor NULL e 0 (zero) no teu select, ele provavelmente deve participar de uma UNION e, por não ter esses valores nesta tabela, passou-se NULL e um Alias para ele.

Qualquer dúvida, manda ai, beleza?

Enviado: Qui, 27 Dez 2007 9:23 am
por marquesjr
tudo beleza, chegando fim de ano e o cara cheio de dúvidas, é mole, mas é uma dúvida simples básica mesmo, venho martelando para inserir a descrição do produto nesse select o join seria esse:

Selecionar tudo

itcontagem.cd_produto = produto.cd_produto
uma das tentativa ficou o seguinte:

Selecionar tudo

Select Saldo_Atual.cd_contagem
     , Saldo_Atual.dt_contagem
     , Saldo_Atual.dt_geracao
     , Saldo_Atual.cd_produto
     , Saldo_Atual.ds_unidade
     , produto.ds_produto
     , Saldo_Atual.Qt_estoque AS QT_APOS
     , Nvl(Saldo_Anterior.qt_anterior, 0) AS QT_ANTERIOR
     , Saldo_Atual.vl_custo_medio
  From (
Select contagem.cd_contagem
     , contagem.dt_contagem
     , contagem.dt_geracao
     , itcontagem.cd_produto
     , produto.ds_produto
     , Sum(itcontagem.qt_estoque * uni_pro.vl_Fator) qt_estoque
     , avg(itcontagem.vl_custo_medio / uni_pro.vl_fator ) vl_custo_medio
     , 0 qt_anterior
     , uni_pro.ds_unidade
  From Dbamv.Contagem
     , Dbamv.ItContagem
     , Dbamv.Uni_Pro
     , Dbamv.produto
 Where Contagem.Cd_Contagem = ItContagem.Cd_Contagem
   And ItContagem.Cd_Uni_Pro = Uni_Pro.Cd_Uni_Pro 
   AND itcontagem.cd_produto = produto.cd_produto
Group By Contagem.Cd_Contagem
       , contagem.Dt_Contagem
       , contagem.Dt_Geracao
       , itcontagem.Cd_Produto
       , Uni_Pro.Ds_Unidade
       ) Saldo_Atual
     , (
Select Copia_Estoque.Cd_Contagem
     , Null          dt_contagem
     , Null          dt_geracao
     , Copia_Estoque.cd_produto
     , produto.ds_produto
     , 0 qt_estoque
     , 0 vl_custo_medio
     , Sum(Copia_Estoque.Qt_Estoque) qt_anterior
     , Null  ds_unidade
  From Dbamv.Copia_Estoque
Group By Copia_Estoque.Cd_Contagem
       , Copia_Estoque.cd_produto
       ) Saldo_Anterior
Where Saldo_Atual.Cd_Contagem = Saldo_Anterior.Cd_Contagem(+)
  And Saldo_Atual.Cd_Produto = Saldo_Anterior.Cd_Produto(+) 
  ORDER BY dt_contagem;
e apresentou o seguinte erro:

Selecionar tudo

ORA-00904: "PRODUTO"."DS_PRODUTO": invalid identifier

Enviado: Qui, 27 Dez 2007 9:25 am
por Trevisolli
Brother,

No primeiro trecho do select que você alterou, tenta assim:

Selecionar tudo

Select Saldo_Atual.cd_contagem 
     , Saldo_Atual.dt_contagem 
     , Saldo_Atual.dt_geracao 
     , Saldo_Atual.cd_produto 
     , Saldo_Atual.ds_unidade 
     , Saldo_Atual.ds_produto 
     , Saldo_Atual.Qt_estoque AS QT_APOS 
     , Nvl(Saldo_Anterior.qt_anterior, 0) AS QT_ANTERIOR 
     , Saldo_Atual.vl_custo_medio 
  From (
...
O Alias é Saldo_Atual, por isso do erro.

qualquer coisa, manda ai pra gente.

Enviado: Qui, 27 Dez 2007 9:32 am
por marquesjr

Selecionar tudo

Select Copia_Estoque.Cd_Contagem 
     , Null          dt_contagem 
     , Null          dt_geracao 
     , Copia_Estoque.cd_produto 
     , produto.ds_produto ---*****
ficou o mesmo erro, só que na linha destacada

Enviado: Qui, 27 Dez 2007 9:45 am
por Trevisolli
Você tem a tabela de produtos nesse trecho ai brother?
Se não tiver e, for uma UNION, coloque:

Selecionar tudo

null produto

Enviado: Qui, 27 Dez 2007 10:00 am
por marquesjr
rapaz, não é que deu certo mesmo..., select violenta. valeu irmão!

Enviado: Qui, 27 Dez 2007 10:01 am
por Trevisolli
beleza brother,

Precisando, conta com a gente aqui.

Enviado: Qui, 27 Dez 2007 10:52 am
por marquesjr
aproveitando o espirito de natal, venho trazer um nova dúvida pontual:

Selecionar tudo

     , Sum(itcontagem.qt_estoque / uni_pro.vl_Fator) qt_estoque 
     , avg(itcontagem.vl_custo_medio * uni_pro.vl_fator ) vl_custo_medio 
     , 0 qt_anterior 
como faço para utilizar um divisor na linha:

Selecionar tudo

     , 0 qt_anterior
igual o utilizado na linha;

Selecionar tudo

     , Sum(itcontagem.qt_estoque / uni_pro.vl_Fator) qt_estoque
quero dividir o qt_anterior por vl_fator.

tentei os seguintes códigos:

Selecionar tudo

     , (0 qt_anterior / uni_pro.vl_fator)

Selecionar tudo

     , 0 qt_anterior / uni_pro.vl_fator

Selecionar tudo

     , 0 (qt_anterior / uni_pro.vl_fator)

Enviado: Qui, 27 Dez 2007 10:57 am
por Porva
mas o 'qt_anterior' você não tinha criado como Alias?

se for, acho que não tem como botar isso aí em cálculo algum!, a não ser que realmente você tenha esse valor em outro lugar, o qt_anterior como valor/campo.

Enviado: Qui, 27 Dez 2007 11:18 am
por marquesjr
o qt anterior é da tabela copia_estoque.

Selecionar tudo

Copia_Estoque.Qt_Estoque