Olá!
Como não tenho Foxpro, usei MariaDB mesmo. O problema apresentado é uma ótima oportunidade para aplicar funções de agregação (Count, Sum, Avg, Max, Min) do SQL e outras funções, mostradas abaixo. A lógica é a apresentada pelo Quintas...
JoséQuintas escreveu:- Um pra somar quantidade
- Um pra pegar primeira data
- Um pra pegar última data
... mas em uma única query, como queria romulobonnadio
1 - Criar tabela para testes:
CREATE TABLE `tbtroca` (
`idTroca` INT(11) NOT NULL AUTO_INCREMENT,
`idCliente` INT(11) NOT NULL DEFAULT '0',
`idProduto` INT(11) NOT NULL DEFAULT '0',
`dtTroca` DATE NOT NULL,
`qtUsada` DECIMAL(10,0) NOT NULL,
PRIMARY KEY (`idTroca`)
)
COLLATE='latin1_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=8;
2 - Populando a tabela:
INSERT INTO `tbtroca` (`idCliente`, `idProduto`, `dtTroca`, `qtUsada`) VALUES (1, 1, '2015-01-10', 3);
INSERT INTO `tbtroca` (`idCliente`, `idProduto`, `dtTroca`, `qtUsada`) VALUES (1, 1, '2015-02-10', 2);
INSERT INTO `tbtroca` (`idCliente`, `idProduto`, `dtTroca`, `qtUsada`) VALUES (1, 1, '2015-03-10', 1);
INSERT INTO `tbtroca` (`idCliente`, `idProduto`, `dtTroca`, `qtUsada`) VALUES (1, 1, '2015-04-10', 4);
INSERT INTO `tbtroca` (`idCliente`, `idProduto`, `dtTroca`, `qtUsada`) VALUES (1, 1, '2015-05-10', 4);
INSERT INTO `tbtroca` (`idCliente`, `idProduto`, `dtTroca`, `qtUsada`) VALUES (1, 1, '2015-06-10', 2);
INSERT INTO `tbtroca` (`idCliente`, `idProduto`, `dtTroca`, `qtUsada`) VALUES (1, 1, '2015-07-10', 3);
INSERT INTO `tbtroca` (`idCliente`, `idProduto`, `dtTroca`, `qtUsada`) VALUES (2, 1, '2015-07-03', 3);
INSERT INTO `tbtroca` (`idCliente`, `idProduto`, `dtTroca`, `qtUsada`) VALUES (3, 1, '2013-02-10', 3);
INSERT INTO `tbtroca` (`idCliente`, `idProduto`, `dtTroca`, `qtUsada`) VALUES (3, 1, '2014-03-21', 5);
INSERT INTO `tbtroca` (`idCliente`, `idProduto`, `dtTroca`, `qtUsada`) VALUES (3, 1, '2015-04-10', 3);
INSERT INTO `tbtroca` (`idCliente`, `idProduto`, `dtTroca`, `qtUsada`) VALUES (4, 1, '2015-05-23', 1);
INSERT INTO `tbtroca` (`idCliente`, `idProduto`, `dtTroca`, `qtUsada`) VALUES (4, 1, '2015-06-10', 2);
INSERT INTO `tbtroca` (`idCliente`, `idProduto`, `dtTroca`, `qtUsada`) VALUES (5, 1, '2015-07-10', 3);
3 - Selecionando dados:
SELECT idCliente Cliente,
COUNT(idCliente) Trocas,
DATE_FORMAT(MIN(dtTroca), "%d-%m-%Y" ) Primeira,
DATE_FORMAT(MAX(dtTroca), "%d-%m-%Y" ) Última,
DATEDIFF(MAX(dtTroca),MIN(dtTroca)) Intervalo,
DATEDIFF(MAX(dtTroca),MIN(dtTroca)) / COUNT(idCliente) Média,
DATE_FORMAT(DATE_ADD(MAX(dtTroca), INTERVAL CAST((DATEDIFF(MAX(dtTroca),Min(dtTroca)) / COUNT(idCliente) ) AS Decimal(0)) DAY), "%d-%m-%Y" ) Próxima,
AVG(qtUsada) 'Consumo Médio'
FROM tbtroca
-- WHERE idCliente = 1
GROUP BY idCliente
HAVING Count(idCliente) > 1
4 - Observações:
- Para efeito de exemplo, clientes com apenas uma troca foram ignorados pois não teriam média. Num cenário real, pode-se optar por outro tratamento para o caso.
- Nas linhas 6 e 7 da consulta, a intenção era usar a função de agregação AVG mas, dá um erro que ainda não consegui solucionar.
5 - Exibindo resultados: