Ir para conteúdo

POWERED BY:

Arquivado

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

Davis

SELECT inteligente

Recommended Posts

Opa!

 

Vamos lá: tenho 2 tabelas (tbCustomers e tbHistory). Na primeira eu tenho os doadores e na segunda eu tenho as doações. Eu preciso fazer um relatório onde eu pego todos os doadores e suas respectivas doações em um determinado mês. Nesse ponto está ok. O problema maior é o seguinte:

 

- Pegar os doadores que doaram pela primeira vez em um determinado mês (ex.: se a primeira doação do cara foi em janeiro ele só aparece neste mês);

- Pegar os outros doadores do mês.

 

Com isso deveria ficar mais ou menos assim:

-Janeiro

-- 1a doação: 50

-- outros: 100

-- total: 150

 

... e por aí vai.

 

Existe alguma maneira simples de pegar só esses doadores? Eu pensei em usar o DISTINCT junto com o COUNT mas, além de pegar todo mundo do mês escolhido, ele não sabe se é a primeira doação do cara ou não.

 

Alguma idéia? http://forum.imasters.com.br/public/style_emoticons/default/grin.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

- Pegar os doadores que doaram pela primeira vez em um determinado mês

faça uma view desta tabela: tbCustomers com o distinct por nome;

faça uma outra view, com o count por nome;

faça uma terceira view, fazendo join entre estas duas

 

é por ai ;)

 

Abs

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não tentei ainda mas, provavelmente, os mesmos doadores apareceriam todos os meses, já que é um esquema de doação mensal. Eu até pensei em colocar uma flag no BD mas o mesmo já está rodando a algum tempo e seria tenso localizar as primeiras doações na unha pra setar a flag.Tem a data da doação (date_pay) que eu estou usando pra filtrar os meses mas o problema mesmo é a porcaria da primeira doação do cara (primeira doação de sempre). Tipo (caso eu não tenha explicado direito acima), se a primeira doação do cara foi em janeiro ele não apareceria como primeiro doador agora em março, e sim como "outros".

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fuçando e pesquisando eu descobri que poderia usar a função MIN() pra pegar a menor data (a mais antiga) e depois usar o INTERSECT pra poder cruzar com as referências de outra busca. Legal, né? :D

 

Vejamos:

		SELECT --Primeira doação, não importa o período				H.id_customer, MIN(H.date_pay) as date_pay, 	(	SELECT AVG(amount_pay) as amount_pay FROM tbHistory INNER JOIN tbCustomers ON tbHistory.id_customer = tbCustomers.id 	WHERE		amount_pay is not null AND		tbCustomers.del = '0' AND		tbCustomers.type_member = 7	)	FROM		tbHistory as H	INNER JOIN		tbCustomers as C ON H.id_customer = C.id	WHERE		(H.amount_pay is not null) AND		(C.del = '0') AND		(C.type_member = 7)	GROUP BY		H.id_customer		INTERSECT			SELECT -- doações de um mês específico - DEZEMBRO, por exemplo		H.id_customer, MIN(H.date_pay) as date_pay,		(		SELECT AVG(amount_pay) as amount_pay FROM tbHistory INNER JOIN tbCustomers ON tbHistory.id_customer = tbCustomers.id 		WHERE amount_pay is not null AND		tbCustomers.del = '0' AND		tbCustomers.type_member = 7 		)	FROM		tbHistory as H	INNER JOIN		tbCustomers as C ON H.id_customer = C.id	WHERE		(H.amount_pay is not null) AND		(C.del = '0') AND		(C.type_member = 7) AND		(MONTH(H.date_pay) = '12')	GROUP BY		H.id_customer

 

É isso aí! http://forum.imasters.com.br/public/style_emoticons/default/joia.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vlw Davis pelo retorno. Que bom que deu certo... ;)

Até gravei esta sua consulta para uma possivel referencia ;)

 

Abs

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.