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

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


SQL Muito complicado de Fazer "Linhas em Colunas"

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 Link para criar as tabelas e testar.
Fico a Atenção dos Colegas.



Mais detalhes sobre a lista de discussão lista