Subquery enchergar aliases com mais de um nível acima!

Oracle

19/06/2013

Bom dia!

Tenho um primeiro SQL que lista alguns clientes, e tenho um segundo SQL muito extenso que eu preciso usar como SUBQUERY no primeiro, para obter um total referente a cada cliente, mas o que eu precisava exatamente, era que essa minha subquery enchergasse minha aliases do meu primeiro SQL! Pelo fato dessa meu segundo SQL também ter alguma subquerys, ficou dificil adaptar!

Este é meu código:


Select c2.CodCli as "Código", v2.Nome as Nome_Vendedor, c2.NomeRed as "Cliente", k2.Nome as "Contato", c2.Fone1,  v2.NomeRed as "Carteira" 

, (Select Sum(Valor_Total) From
(Select t.Base, t.Chave_Cliente, t.Nome, t.NF, t.Descricao_Produto, t.Data_Emissao, t.Codigo_Produto, t.CodProd, t.Quantidade, t.Unidade, t.Carteira, t.CodCli, t.Cliente, t.Nome_Fantasia, t.Contato, t.Telefone, t.Valor_Total, t.Preco_Unitario
From
(Select Base, Chave_Cliente, Nome, NF, Descricao_Produto, Data_Emissao, Codigo_Produto
, (Case When (Base = 'GO') then SUBSTR(Codigo_Produto, 2, 999 ) else Codigo_Produto end ) as CodProd
, Quantidade, Unidade, Carteira, CodCli, Cliente, Nome_Fantasia, Contato, Telefone, Valor_Total, Preco_Unitario

From
(
Select 'SP' as Base, n.Chave_Cliente, c.Nome, n.NF, i.Descricao_Produto, n.Data_Emissao, i.Codigo_Produto, i.Quantidade, i.Unidade, v.NomeRed as Carteira, c.CodCli, c.Nome as Cliente, c.NomeRed as Nome_Fantasia, k.Nome as Contato, c.Fone1 as Telefone, cast(i.Valor_Total as float) as Valor_Total, i.Preco_Faturado as Preco_Unitario

from Pharmacopeia.Produtos p
inner join Pharmacopeia.Notas_Itens i on p.codigo = i.codigo_produto 
inner join pharmacopeia.notas n on n.chave = i.chave_nota
inner join Pharmacopeia.Clientes c on n.Chave_Cliente = c.CodCli
inner join Pharmacopeia.Vendedores v on c.CodVend = v.CodVendedor
inner join Pharmacopeia.Contatos k on c.Contato_Padrao = k.Chave
where p.chave_familia= 12 and p.produto= 'SIM' and p.qualidade_critica= 'SIM'
      and p.chave_familia=12 and p.produto= 'SIM' and p.qualidade_critica= 'SIM'
      and v.Chave_Canal = 12 and v.Inativo = 'NAO'
      and v.CodVendedor = 770
      and c.CodCli = :pCodCli1
      
Union

Select 'GO' as Base, n.Chave_Cliente, c.Nome, n.NF, i.Descricao_Produto, n.Data_Emissao, i.Codigo_Produto, i.Quantidade, i.Unidade, v.NomeRed as Carteira, c.CodCli, c.Nome as Cliente, c.NomeRed as Nome_Fantasia, k.Nome as Contato, c.Fone1 as Telefone, cast(i.Valor_Total as float) as Valor_Total, i.Preco_Faturado as Preco_Unitario

from Attivos.Produtos p
inner join Attivos.Notas_Itens i on p.codigo = i.codigo_produto 
inner join Attivos.notas n on n.chave = i.chave_nota
inner join Attivos.Clientes c on n.Chave_Cliente = c.CodCli
inner join Attivos.Vendedores v on c.CodVend = v.CodVendedor
inner join Attivos.Contatos k on c.Contato_Padrao = k.Chave
where p.chave_familia= 12 and p.produto= 'SIM' and p.qualidade_critica= 'SIM'
      and p.chave_familia=12 and p.produto= 'SIM' and p.qualidade_critica= 'SIM'
      and v.Chave_Canal = 12 and v.Inativo = 'NAO'
      and v.CodVendedor = 770
      and c.CodCli = :pCodCli2
) ) t
Inner Join 
(Select Max(Data_Emissao) as Data_Emissao, CodProd
From  
(Select Base, Chave_Cliente, Nome, NF, Descricao_Produto, Data_Emissao, Codigo_Produto
, (Case When (Base = 'GO') then SUBSTR(Codigo_Produto, 2, 999 ) else Codigo_Produto end ) as CodProd
, Quantidade, Unidade, Carteira, CodCli, Cliente, Nome_Fantasia, Contato, Telefone, Valor_Total, Preco_Unitario

From
(
Select 'SP' as Base, n.Chave_Cliente, c.Nome, n.NF, i.Descricao_Produto, n.Data_Emissao, i.Codigo_Produto, i.Quantidade, i.Unidade, v.NomeRed as Carteira, c.CodCli, c.Nome as Cliente, c.NomeRed as Nome_Fantasia, k.Nome as Contato, c.Fone1 as Telefone, cast(i.Valor_Total as float) as Valor_Total, i.Preco_Faturado as Preco_Unitario

from Pharmacopeia.Produtos p
inner join Pharmacopeia.Notas_Itens i on p.codigo = i.codigo_produto 
inner join pharmacopeia.notas n on n.chave = i.chave_nota
inner join Pharmacopeia.Clientes c on n.Chave_Cliente = c.CodCli
inner join Pharmacopeia.Vendedores v on c.CodVend = v.CodVendedor
inner join Pharmacopeia.Contatos k on c.Contato_Padrao = k.Chave
where p.chave_familia= 12 and p.produto= 'SIM' and p.qualidade_critica= 'SIM'
      and p.chave_familia=12 and p.produto= 'SIM' and p.qualidade_critica= 'SIM'
      and v.Chave_Canal = 12 and v.Inativo = 'NAO'
      and v.CodVendedor = 770
      and c.CodCli = :pCodCli3
      
Union

Select 'GO' as Base, n.Chave_Cliente, c.Nome, n.NF, i.Descricao_Produto, n.Data_Emissao, i.Codigo_Produto, i.Quantidade, i.Unidade, v.NomeRed as Carteira, c.CodCli, c.Nome as Cliente, c.NomeRed as Nome_Fantasia, k.Nome as Contato, c.Fone1 as Telefone, cast(i.Valor_Total as float) as Valor_Total, i.Preco_Faturado as Preco_Unitario

from Attivos.Produtos p
inner join Attivos.Notas_Itens i on p.codigo = i.codigo_produto 
inner join Attivos.notas n on n.chave = i.chave_nota
inner join Attivos.Clientes c on n.Chave_Cliente = c.CodCli
inner join Attivos.Vendedores v on c.CodVend = v.CodVendedor
inner join Attivos.Contatos k on c.Contato_Padrao = k.Chave
where p.chave_familia= 12 and p.produto= 'SIM' and p.qualidade_critica= 'SIM'
      and p.chave_familia=12 and p.produto= 'SIM' and p.qualidade_critica= 'SIM'
      and v.Chave_Canal = 12 and v.Inativo = 'NAO'
      and v.CodVendedor = 770
      and c.CodCli = :pCodCli4
) )

Group By CodProd) B
On (t.CodProd = b.CodProd and t.Data_Emissao = b.Data_Emissao)
Order By t.CodProd, t.Data_Emissao
)

Where Data_Emissao >= (Sysdate - 45) and Data_Emissao <= (Sysdate - 31) ) as Total_Acumulado


From Pharmacopeia.Clientes c2, Pharmacopeia.Vendedores v2, Pharmacopeia.Contatos k2

Where c2.CodVend = v2.CodVendedor
            and c2.Contato_Padrao = k2.Chave
            and v2.Chave_Canal = 12 and v2.Inativo = 'NAO'
            and v2.CodVendedor = 770


Então, nos lugares que "c.CodCli" estão recebendo o parâmetro :pCodCli1, :pCodCli2, :pCodCli3 e :pCodCli4 que devera ser alterado! Em vez de receber os parâmetros, deverão receber a aliases do primeiro SQL "c2.CodCli", mas minha subquery não encherga essa aliases :(

Existe alguma maneira de deixar uma aliases global ? Posso estar falando besteira, é que não entendo muito de SQL, estou aprendendo de acordo com as necessidades!

Muito Obrigado!
Mateus Ribeiro

Mateus Ribeiro

Curtidas 0
POSTAR