SELECT MAX

LORDAUTUNM 18/03/2010 18:37:59
#337347
Boa Noite, estou na seguinte situação e queria uma mão dos irmãos do VBmania

Tenho uma tabela de Venda com os seguintes campos:
Campo1 (tipodata), campo5(texto-cliente) e campo4(numero)

preciso saber qual cliente comprou mais entre um periodo de tempo, tentei assim:

Select max(total) as Valor, campo5, per from(SELECT sum(campo4) as Total, campo5, month(campo1) as Per FROM C_Ven where (Campo1 Between #03/01/2009# AND #03/18/2010#) Group by campo5, month(campo1)) group by campo5, per

O resultado é o valor maximo de cada cliente no mes e eu preciso do valor maximo apenas e nao de todos os clientes levando em consideração que o mesmo pode aparecer se tiver efetuado o maior numero de compras em meses destintos.

Precisaria de um filtro que anulasse group by no primeiro Select.

Desde ja agradeço!



GERMANIR 18/03/2010 19:12:18
#337351
Em primeiro lugar você não citou o tipo de banco de utiliza.

Pelo que entendi o você tem o cliente, a data da venda e o número de itens ou valor da compra.

Para saber os clientes que mais compraram numa data:
EXEMPLO NO BANCO POSTGREE

CREATE TABLE VENDAS(
nome varchar(50),
ndata date,
numero int
)

INSERT INTO VENDAS
VALUES ([ô]Germanir[ô],[ô]2010-03-17[ô],2),
([ô]Germanir[ô],[ô]2010-03-18[ô],3),
([ô]Germanir[ô],[ô]2010-03-19[ô],2),
([ô]Marcos[ô],[ô]2010-03-30[ô],5),
([ô]Marcos[ô],[ô]2010-03-17[ô],6),
([ô]Laura[ô],[ô]2010-03-17[ô],8),
([ô]Marcos[ô],[ô]2010-03-17[ô],2),
([ô]José[ô],[ô]2010-04-17[ô],2),
([ô]Laura[ô],[ô]2010-03-17[ô],10),
([ô]José[ô],[ô]2010-04-17[ô],2);

select to_char(ndata,[ô]mm[ô]) as mes ,nome, sum(numero) as total from vendas
where ndata between [ô]2010-03-01[ô] and [ô]2010-04-30[ô]
group by ndata, nome
order by ndata, total DESC;


Resultado:
mes nome total
03 Laura 18
03 Marcos 8
03 Germanir 2
03 Germanir 3
03 Germanir 2
03 Marcos 5
04 José 4


OBS: POSTGREE CONVERSÃO DE DATA é O TO_CHAR
MYSQL DATA_FORMAT
SQL SERVER CONVERT
FIREBIRD (ainda não sei) rssss
LORDAUTUNM 18/03/2010 20:01:24
#337352
O Banco é Acess

Minha Consulta retorna identico a sua.
No seu exemplo a consulta retornou 5 clientes no mes 3, e o q eu quero é apenas o cliente que efetuaou mais compras,
se fosse para saber so o maior valor bataria usar o MAX, mas preciso Saber o Valor, o cliente e o mes.
LLAIA 18/03/2010 20:43:16
#337353
Tente assim:

Select top 1 max(total) as Valor, campo5, per from(SELECT sum(campo4) as Total, campo5, month(campo1) as Per FROM C_Ven where (Campo1 Between #03/01/2009# AND #03/18/2010#) Group by campo5, month(campo1)) group by campo5, per order by max(total) desc



* o problema se tivermoss um [ô]empate[ô] entre dois clientes O_0
LORDAUTUNM 19/03/2010 15:11:07
#337421
Assim ele so traz o Cliente que mais comprou em toda a busca, e eu preciso do cliente que mais comprou em cada mes do periodo da busca.

To tentando
LORDAUTUNM 19/03/2010 15:47:11
#337431
Como nao consegui usando consulta fiz assim:


[ô]por nao agrupar nome e da mes junto a atualização é feita em duas etapas

Abri tb1, [Ô]Select max(total) as Valor, per [Ô] & _
[Ô]from(SELECT sum(campo4) as Total, campo5, month(campo1) as Per FROM C_Ven where [Ô] & _
[Ô](Campo1 Between #[Ô] & Format(Mask(0), [Ô]mm/dd/yyyy[Ô]) & [Ô]# AND #[Ô] & Format(Mask(1), [Ô]mm/dd/yyyy[Ô]) & _
[Ô]#) Group by campo5, month(campo1)) group by per[Ô]

Do While Not tb1.EOF
DoEvents
mConn.Execute [Ô]Update Mes Set saldo=[ô][Ô] & Format(tb1!Valor, [Ô]#,###,###,##0.00[Ô]) & [Ô][ô] Where campo0=[Ô] & tb1!per
tb1.MoveNext
Loop
tb1.Close


Abri tb1, [Ô]Select max(total) as Valor, campo5, per [Ô] & _
[Ô]from(SELECT sum(campo4) as Total, campo5, month(campo1) as Per FROM C_Ven where [Ô] & _
[Ô](Campo1 Between #[Ô] & Format(Mask(0), [Ô]mm/dd/yyyy[Ô]) & [Ô]# AND #[Ô] & Format(Mask(1), [Ô]mm/dd/yyyy[Ô]) & _
[Ô]#) Group by campo5, month(campo1)) group by campo5, per[Ô]

Do While Not tb1.EOF
DoEvents
mConn.Execute [Ô]Update Mes Set cliente=[ô][Ô] & tb1!campo5 & [Ô][ô] Where Saldo=[ô][Ô] & Format(tb1!Valor, [Ô]#,###,###,##0.00[Ô]) & [Ô][ô][Ô]
tb1.MoveNext
Loop
tb1.Close


Alguem ve falhas
MARCELO.TREZE 19/03/2010 19:55:50
#337464
tenta assim

Select Max(sum(campo4)) as Total, campo5, per from C_Ven where (Campo1 Between #03/01/2009# AND #03/18/2010#) Group by campo5, month(campo1)) group by campo5, per
Tópico encerrado , respostas não são mais permitidas