Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Solfier

"reutilizar" resultado de função

Recommended Posts

boa tarde!

 

estou com um problema de otimização de query...

 

tenho um select (segue abaixo) em que precisaria usar 2 vezes o resultado da mesma função. Porém tentei referenciar o resultado pelo nome da coluna, mas não deu certo...

 

como eu poderia "reutilizar" o resultado da função, para não precisar precessá-la novamente?

 

obrigado!!!

 

select 	TOP 3
	CO.fullname as 'Vendedor',
	c*.fullname as 'Cliente',
	SUM(
		case when AD.direct_price > 0 then 
			(IT.charged_price * 
				( (100 - AD.discount) / 100) *
				( 1 + AD.increase / 100 ) *
				( (100 - AD.commission_interm) / 100) *
				( (100 - AD.discount_interm) / 100))
		else (IT.charged_price *
				( (100 - AD.commission_interm) / 100))
		end) as 'Valor',
	Easyclass.dbo.CL_TotalVendedor(CO.contact_id, '2009-01-01', '2009-01-31') as 'Total Vendedor',
	('Valor' * 100 / 'Total Vendedor') as 'Percentual'
from 	EC_Contact CO with(nolock)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nao da pra voce usar duas vezes tentando armazena-lo por exemplo numa variavel e na mesma sequencia usar essa variavel.

 

O que voce pode fazer como alternativa é gravar esses registros numa tabela TEMPORÁRIA ou uma variavel tipo TABLE.

 

Seria algo do tipo:

 


/*
create table #tmp_processamento(
vendedor varchar(100),
.....lista dos demais campos
)
*/

select  TOP 3
        CO.fullname as 'Vendedor',
        c*.fullname as 'Cliente',
        SUM(
                case when AD.direct_price > 0 then 
                        (IT.charged_price * 
                                ( (100 - AD.discount) / 100) *
                                ( 1 + AD.increase / 100 ) *
                                ( (100 - AD.commission_interm) / 100) *
                                ( (100 - AD.discount_interm) / 100))
                else (IT.charged_price *
                                ( (100 - AD.commission_interm) / 100))
                end) as 'Valor',
        Easyclass.dbo.CL_TotalVendedor(CO.contact_id, '2009-01-01', '2009-01-31') as 'Total Vendedor',
        ('Valor' * 100 / 'Total Vendedor') as 'Percentual'
INTO
#tmp_processamento
from    
EC_Contact CO with(nolock)

select 
Vendedor,
Cliente,
[Total Vendedor]
[Total Vendedor] / 2 [Total Vendedor Reprocessado]
from 
#tmp_processamento

dessa forma qualquer outra operação pode ser feita nessa tabela temporaria ou variavel tipo table, que voce tambem pode criar indices e organizar de uma melhor forma....apenas um detalhe: se voce usar variavei tipo table nao poderá criar indices.

 

exemplo com a variavel tipo table:

 

declare @tmp_processamento TABLE(

Vendedor varchar(100),
Cliente varchar(100),
...demais campos
)


select 
Vendedor,
Cliente,
Total
from @tmp_processamento

espero ter ajudado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.