select complicada

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
marquesjr
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 77
Registrado em: Qua, 05 Dez 2007 10:51 am
Localização: Fortaleza - CE

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(+)
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

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

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?
marquesjr
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 77
Registrado em: Qua, 05 Dez 2007 10:51 am
Localização: Fortaleza - CE

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
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

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

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.
marquesjr
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 77
Registrado em: Qua, 05 Dez 2007 10:51 am
Localização: Fortaleza - CE

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
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

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

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

Selecionar tudo

null produto
marquesjr
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 77
Registrado em: Qua, 05 Dez 2007 10:51 am
Localização: Fortaleza - CE

rapaz, não é que deu certo mesmo..., select violenta. valeu irmão!
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

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

beleza brother,

Precisando, conta com a gente aqui.
marquesjr
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 77
Registrado em: Qua, 05 Dez 2007 10:51 am
Localização: Fortaleza - CE

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)
Avatar do usuário
Porva
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 342
Registrado em: Seg, 29 Jan 2007 7:36 am
Localização: São Paulo/SP
Rafael S. Nunes
São Paulo/SP

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.
marquesjr
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 77
Registrado em: Qua, 05 Dez 2007 10:51 am
Localização: Fortaleza - CE

o qt anterior é da tabela copia_estoque.

Selecionar tudo

Copia_Estoque.Qt_Estoque
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Majestic-12 [Bot] e 10 visitantes