Estou tentando mostrar resultados por 12 meses usando esta consulta:
SELECT
COUNT(DISTINCT user_id) as customers,
SUM(amount)*.01 as amount,
SUM(amount_refunded)*.01 as refunded,
MONTH(MAX(created_at)) as month
FROM `payments`
WHERE `amount` > 0
AND `status` = 'succeeded'
AND `created_at` BETWEEN NOW() - INTERVAL 2 MONTH AND NOW() - INTERVAL 1 MONTH
AND `user_id` IN (SELECT `id` FROM `users` WHERE `created_at` BETWEEN NOW() - INTERVAL 2 MONTH AND NOW() - INTERVAL 1 MONTH);
Poderia facilmente fazer isso programaticamente usando PHP para gerar uma tabela HTML onde cada linha inclui mostra um mês diferente, incrementando o mês e consultando o banco de dados novamente a cada vez.
Como eu faria isso com esta consulta usando um loop MySQL FOR? Essa seria mesmo a abordagem correta?
Como @Rick James mencionou, uma
GROUP BY
função deve fazer o truque aqui, e você pode usar esta resposta SO para limitá-la aos últimos 12 meses. Para o seu exemplo, a consulta seria algo assim:NOTA: Comentei a subconsulta para
user_id
porque significaria que os resultados seriam apenas para os clientes que criaram uma conta e fizeram uma compra no ano passado, e eu não tinha certeza se esse era o resultado desejado. Se sim, apenas descomente. Editei a subconsulta para que funcione dessa maneira