select complicada

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

Mensagemem Qua, 26 Dez 2007 5:18 pm

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?

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


Código: Selecionar todos
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(+)
marquesjr
Localização: Fortaleza - CE

Mensagemem Qui, 27 Dez 2007 7:06 am

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?
Trevisolli
Localização: Araraquara - SP

Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Mensagemem Qui, 27 Dez 2007 9:23 am

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:

Código: Selecionar todos
itcontagem.cd_produto = produto.cd_produto


uma das tentativa ficou o seguinte:

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

ORA-00904: "PRODUTO"."DS_PRODUTO": invalid identifier
marquesjr
Localização: Fortaleza - CE

Mensagemem Qui, 27 Dez 2007 9:25 am

Brother,

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

Código: Selecionar todos
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.
Trevisolli
Localização: Araraquara - SP

Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Mensagemem Qui, 27 Dez 2007 9:32 am

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
marquesjr
Localização: Fortaleza - CE

Mensagemem Qui, 27 Dez 2007 9:45 am

Você tem a tabela de produtos nesse trecho ai brother?
Se não tiver e, for uma UNION, coloque:

Código: Selecionar todos
null produto
Trevisolli
Localização: Araraquara - SP

Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Mensagemem Qui, 27 Dez 2007 10:00 am

rapaz, não é que deu certo mesmo..., select violenta. valeu irmão!
marquesjr
Localização: Fortaleza - CE

Mensagemem Qui, 27 Dez 2007 10:01 am

beleza brother,

Precisando, conta com a gente aqui.
Trevisolli
Localização: Araraquara - SP

Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Mensagemem Qui, 27 Dez 2007 10:52 am

aproveitando o espirito de natal, venho trazer um nova dúvida pontual:

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

Código: Selecionar todos
     , 0 qt_anterior


igual o utilizado na linha;

Código: Selecionar todos
     , Sum(itcontagem.qt_estoque / uni_pro.vl_Fator) qt_estoque


quero dividir o qt_anterior por vl_fator.

tentei os seguintes códigos:

Código: Selecionar todos
     , (0 qt_anterior / uni_pro.vl_fator)


Código: Selecionar todos
     , 0 qt_anterior / uni_pro.vl_fator


Código: Selecionar todos
     , 0 (qt_anterior / uni_pro.vl_fator)
marquesjr
Localização: Fortaleza - CE

Mensagemem Qui, 27 Dez 2007 10:57 am

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.
Porva
Localização: São Paulo/SP

Rafael S. Nunes
São Paulo/SP

Mensagemem Qui, 27 Dez 2007 11:18 am

o qt anterior é da tabela copia_estoque.

Copia_Estoque.Qt_Estoque
marquesjr
Localização: Fortaleza - CE



Voltar para SQL

Quem está online

Usuários navegando neste fórum: Google Adsense [Bot] e 8 visitantes