Ir para conteúdo

POWERED BY:

Arquivado

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

Davis

Stored procedure chata...

Recommended Posts

Olá pessoal!

 

Eu tenho várias tabelas e preciso pegar seus dados, mostrar, tirar uma média (avg_donation) e o total de doadores (circulation). Olhando assim é até simples mas...

 

O problema todo é que eu tenho que agrupar esses resultados por "channel" (campo de uma tabela) e é isso que eu não estou conseguindo fazer. No caso da média eu fiz um SELECT AVG e mandei agrupar por "channel". Isso só funciona quando eu tenho, por exemplo, pessoas com o mesmo id_action. Se entrar uma pessoa com id_action diferente ela não é contabilizada.

 

Segue abaixo a doideira que eu fiz:

 

ALTER PROCEDURE dbo.spActionReport	@type_event	as varchar(3),	@avg_donation	as int = 0 OUTPUT,	@circ		as int = 0 OUTPUTAS	SELECT		ACB.channel as [Channel Code], ACB.id_action as [Action Code], A.description as [Description], 		D.title_dict as [Name of List], A.drop_date as [Drop Date], H.amount_pay	FROM		tbActions AS A	INNER JOIN		tbActionsCB AS ACB ON A.id_action = ACB.id_action	INNER JOIN		tbHistory AS H ON A.id_action = H.id_action	INNER JOIN		tbDict AS D ON ACB.data_vendor = D.id	WHERE		H.main_event = '2' AND H.type_event = @type_event	ORDER BY		ACB.channel			SET @avg_donation = (		SELECT			AVG(H.amount_pay)		FROM			tbHistory AS H		INNER JOIN			tbActionsCB AS ACB ON H.id_action = ACB.id_action		WHERE			H.main_event = '2' AND H.type_event = @type_event		GROUP BY			ACB.channel	)	SET @circ = ( --circulation		SELECT			COUNT(DISTINCT(DD.id))		FROM			tbDDebit AS DD		LEFT JOIN			tbHistory AS H ON DD.id_action = H.id_action		WHERE			H.type_event = @type_event	)

valeu http://forum.imasters.com.br/public/style_emoticons/default/natal_smile.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, depois de um tempinho pesquisando eu consegui refazer essa stored procedure de uma maneira decente:

ALTER PROCEDURE dbo.spActionReport	@type_event as varchar(3)AS	SELECT		D1.title_dict, ACB.id_action, D.title_dict AS Expr1, A.drop_date, 		COUNT(DISTINCT H.id_customer) AS circulation, AVG(H.amount_pay) AS avg_donation	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.data_vendor = D.id	INNER JOIN		tbDict AS D1 ON ACB.channel = D1.id	GROUP BY		A.drop_date, D.title_dict, ACB.id_action, D1.title_dict, H.type_event	HAVING		(AVG(H.amount_pay) <> 0) AND (H.type_event = @type_event)			RETURN

Tá funcionando que é uma maravilha mas eu ainda tenho um problema: Preciso colocar o campo "description" mas ele é do tipo "text" e não consigo agrupá-lo pelo GROUP BY. Se eu deixá-lo de fora o SQL Server 2005 não aceita. Existe alguma solução pra isso?

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.