[firebase-br] SQL Muito complicado de Fazer "Linhas em Colunas"

Luciano franca luapfirebird em yahoo.com.br
Qua Abr 22 23:38:27 -03 2015


Estou mandando o Mesmo Email pois o 1º perdeu a Formatação.
Pessoal passei dia todo otimizando um SQL que está muito lento
São duas Tabelas :: 
Cadastro_MercadoriasCadastro_Precos

Na tabela tabela de "Cadastro_Precos"  pode se ter varios codigos PK da tabela "Cadastro_Mercadorias"
Veja eu não posso usar  "Sub-Select"   pois o carregamento da Query Fica muito lento  então devo fazer Case para Fazer Linhas Virar Colunas
Usando esse Primeiro Código 
SELECT   Cm.codigo,
   CM.mercadoria,
   GP.Descricao

 , (Max(Case  When (GP.Cod_Nome_Precos is Not Null And GP.Cod_Nome_Precos = '1') Then
  GP.PRECO_VENDA End)) As VENDA_VISTA

 , (Max(Case  When (GP.Cod_Nome_Precos is Not Null And GP.Cod_Nome_Precos = '2') Then
  GP.PRECO_VENDA End)) As VENDA_PRAZO

FROM  cadastro_mercadorias Cm

left join CADASTRO_PRECOS GP on (GP.Cod_produto = CM.Codigo)
Group By 1, 2, 3
Não traz os preços para algumas Colunas e Eu preciso dos Preços para todas Todas Colunas não pode ter colunas com valores Nulosé possivel ver isso na imagen  "SQL1.jpg"  que está no Link :  

https://mega.co.nz/#!U1xEDZjY!tbkoON2LIJzC_DBb87X0tQls-ABz3Y0GEqpeBa_uJgo

Esse Segundo código funciona porém fica cerca de 60% mais lento por ter dois Left Join na Tabela  "Cadastro_Precos"
Eu não consigo fazer com apenas um Left Join sem  "Sub-Select"   se algum colega tiver uma ideia melhor fico muito agradecido.

SELECT   Cm.codigo,
   CM.mercadoria,
   GP.Descricao

 , (Max(Case  When (GP.Cod_Nome_Precos is Not Null And GP.Cod_Nome_Precos = '1') Then
  GP.PRECO_VENDA Else Case When (GP2.Cod_Nome_Precos is Not Null And GP2.Cod_Nome_Precos = '1') Then GP2.Preco_Venda End End)) As VENDA_VISTA

 , (Max(Case  When (GP.Cod_Nome_Precos is Not Null And GP.Cod_Nome_Precos = '2') Then
  GP.PRECO_VENDA Else Case When (GP2.Cod_Nome_Precos is Not Null And GP2.Cod_Nome_Precos = '2') Then GP2.Preco_Venda End End)) As VENDA_PRAZO

FROM  cadastro_mercadorias Cm

left join CADASTRO_PRECOS GP on (GP.Cod_produto = CM.Codigo)       left join CADASTRO_PRECOS GP2 on (GP2.Cod_produto = CM.Codigo)   

Group By 1, 2, 3   


Nesse Link  :: https://mega.co.nz/#!U1xEDZjY!tbkoON2LIJzC_DBb87X0tQls-ABz3Y0GEqpeBa_uJgo

tem o Banco em FB 2.5  e também o Script para criar as tabelas e testar.
Fico a Grato a Atenção dos Colegas.



Mais detalhes sobre a lista de discussão lista