Ir para conteúdo

POWERED BY:

Arquivado

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

Davis

Subquery no having ou outra coisa?

Recommended Posts

Bom, eu tenho uma SP que faz algumas contas e mostra alguns números, nada demais... O problema é que a tbHistory tem vários eventos onde o amount_pay está vazio. Atualmente a SP tá contabilizando esses eventos vazios pra fazer as contagens.

 

Eu até fiz um teste trocando (AVG(H.amount_pay) <> 0) por H.amount_pay is not null mas acontece que eu teria que colocar o H.amount_pay no GROUP BY e isso é algo que eu não quero pois destruiria o relatório. Existe alguma coisa que eu possa fazer, uma subquery ou qualquer outra coisa para que essa SP faça todos esses cálculos ignorando os amount_pay que estão nulos??

 

Eis a problemática:

 

SELECT		ACB.id_action, A.new_id_action, A.proposition, A.sub_data_type, A.drop_date, A.end_date, 		A.circulation, D.title_dict as type_don, (COUNT(H.id_customer) / A.circulation) AS resp_rate, 		COUNT(H.id_customer) as num_gifts,		COUNT(DISTINCT H.id_customer) as num_givers, SUM(H.amount_pay) AS sum_donation, (SUM(H.amount_pay) / COUNT(H.id_customer)) as avg_gift	FROM		tbHistory AS H	INNER JOIN		tbActionsCB AS ACB ON H.id_action = ACB.id_action	INNER JOIN		tbActions AS A ON H.id_action = A.id_action	INNER JOIN		tbDict AS D ON ACB.type_don = D.id	GROUP BY		ACB.id_action, A.new_id_action, A.proposition, ACB.type_don, A.sub_data_type, A.drop_date, A.end_date, 		A.circulation, D.title_dict, H.del, A.year_month, ACB.data_type, ACB.channel	HAVING		(H.del = 0) AND		(AVG(H.amount_pay) <> 0) AND		(@new_id_action is null OR A.new_id_action = @new_id_action)	ORDER BY		ACB.id_action
Ah, só pra se ter uma idéia: Eu puxei um relatório usando essa SP e ela me mostrou que a média do amount_pay é de 0,025 reais(!) o que está completamente errado. http://forum.imasters.com.br/public/style_emoticons/default/upset.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Caramada,

 

Sem as tabelas fica dificil opinar, porém lá vai:

SELECT		ACB.id_action, A.new_id_action, A.proposition, A.sub_data_type, A.drop_date, A.end_date,		A.circulation, D.title_dict as type_don, (COUNT(H.id_customer) / A.circulation) AS resp_rate,		COUNT(H.id_customer) as num_gifts,		COUNT(DISTINCT H.id_customer) as num_givers, SUM(H.amount_pay) AS sum_donation, (SUM(H.amount_pay) / COUNT(H.id_customer)) as avg_gift	FROM		tbHistory AS H	INNER JOIN		tbActionsCB AS ACB ON H.id_action = ACB.id_action	INNER JOIN		tbActions AS A ON H.id_action = A.id_action	INNER JOIN		tbDict AS D ON ACB.type_don = D.idWHERE H.amount_pay IS NOT NULL	GROUP BY		ACB.id_action, A.new_id_action, A.proposition, ACB.type_don, A.sub_data_type, A.drop_date, A.end_date,		A.circulation, D.title_dict, H.del, A.year_month, ACB.data_type, ACB.channel	HAVING		(H.del = 0) AND		(AVG(H.amount_pay) <> 0) --AND	   -- (@new_id_action is null OR A.new_id_action = @new_id_action)	ORDER BY		ACB.id_action
Inclui WHERE H.amount_pay IS NOT NULL para retirar o NULL´s do campo H.amount_pay acho que pode resolver a parada.

 

Note que tive de comentar:

--AND

-- (@new_id_action is null OR A.new_id_action = @new_id_action)

para funcionar senão dá erro de execução.

 

t+

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.