Ir para conteúdo

Arquivado

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

Felipesudrj

[Resolvido] Agrupando e Somando

Recommended Posts

Pessoal alguem pode me dar o caminho das pedras por favor...

 

 

o meu problema é o seguinte...

 

 

tenho uma tabela com varios clientes, que fizeram varias compras...

o que eu quero é...dentro de um certo periodo de tempo...agrupar as compras feitas por meu cliente...e entre todos os clientes ver qual o que mais comprou...somando todas as compras....

 

 

 

 

alguem pode me ajudar a saber qual logica usar para fazer esse calculo?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, montei duas tabelas aqui, não sei se é isso que você precisa, mas lá vai:

 

CREATE TABLE BD_TESTES.CLIENTES (
   ID_CLIENTE INT(11) NOT NULL AUTO_INCREMENT COMMENT "ID do cliente",    
   NOME_CLIENTE VARCHAR(255) NOT NULL COMMENT "Nome do cliente",
   PRIMARY KEY (ID_CLIENTE)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

CREATE TABLE BD_TESTES.COMPRAS (
   ID_COMPRA INT(11) NOT NULL AUTO_INCREMENT COMMENT "ID da compra",
   VALOR NUMERIC(10,4) COMMENT "Valor da compra",    
   DATA_COMPRA DATETIME COMMENT "Data da compra",    
   ID_CLIENTE INT(11) COMMENT "Cliente que fez a compra",
   PRIMARY KEY (ID_COMPRA),    
   FOREIGN KEY (ID_CLIENTE)    
       REFERENCES CLIENTES(ID_CLIENTE)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

INSERT INTO CLIENTES(NOME_CLIENTE) VALUES ('Diego');
INSERT INTO CLIENTES(NOME_CLIENTE) VALUES ('João');
INSERT INTO CLIENTES(NOME_CLIENTE) VALUES ('José');
INSERT INTO CLIENTES(NOME_CLIENTE) VALUES ('Maria');

INSERT INTO COMPRAS(VALOR, DATA_COMPRA, ID_CLIENTE) VALUES(10,'2011-10-10',1);
INSERT INTO COMPRAS(VALOR, DATA_COMPRA, ID_CLIENTE) VALUES(20,'2011-10-13',1);
INSERT INTO COMPRAS(VALOR, DATA_COMPRA, ID_CLIENTE) VALUES(5,'2011-10-10',3);
INSERT INTO COMPRAS(VALOR, DATA_COMPRA, ID_CLIENTE) VALUES(2,'2011-10-01',2);
INSERT INTO COMPRAS(VALOR, DATA_COMPRA, ID_CLIENTE) VALUES(10,'2011-10-30',4);
INSERT INTO COMPRAS(VALOR, DATA_COMPRA, ID_CLIENTE) VALUES(7,'2011-10-18',3);
INSERT INTO COMPRAS(VALOR, DATA_COMPRA, ID_CLIENTE) VALUES(13,'2011-10-15',2);
INSERT INTO COMPRAS(VALOR, DATA_COMPRA, ID_CLIENTE) VALUES(15,'2011-10-25',2);

-- Com essa query abaixo eu retorno os dados das duas tabelas

SELECT CLI.ID_CLIENTE, CLI.NOME_CLIENTE, SUM(COM.VALOR), COUNT(COM.ID_CLIENTE) FROM CLIENTES AS CLI 
JOIN COMPRAS AS COM ON COM.ID_CLIENTE = CLI.ID_CLIENTE
GROUP BY COM.ID_CLIENTE

-- Note o retorno, ignore os valores não tava pensando muito nisso quando fiz os testes:

1 | Diego | 30.0000 | 2
2 | João  | 30.0000 | 3
3 | José  | 12.0000 | 2
4 | Maria | 10.0000 | 1

 

Isso me diz que:

 

O cliente de ID 1, chamado Diego, gastou 30.0000 em 2 compras.

O cliente de ID 2, chamado João, gastou 30.0000 em 3 compras.

O cliente de ID 3, chamado José, gastou 12.0000 em 2 compras.

O cliente de ID 4, chamado Maria, gastou 10.0000 em 1 compras.

 

Retorna nome, ID (opcional pra você eu acho), valor gasto e quantidade de compras. Agora só basta você adicionar o filtro de período. Exemplo:

 

SELECT CLI.ID_CLIENTE, CLI.NOME_CLIENTE, SUM(COM.VALOR), COUNT(COM.ID_CLIENTE) FROM CLIENTES AS CLI 
JOIN COMPRAS AS COM ON COM.ID_CLIENTE = CLI.ID_CLIENTE
WHERE COM.DATA_COMPRA BETWEEN '2011-10-09' AND '2011-10-18'
GROUP BY COM.ID_CLIENTE

 

Espero que seja mais ou menos isso, qualquer coisa posta aê =]

 

Abrass.

 

Edit:

 

Ah uma sugestão: Pode criar um campo na tabela CLIENTES que guarde o número de compras de cada cliente, aí você vai ter que controlar esse campo pela tua aplicação. É melhor que essa gambiarra que eu fiz de COUNT(COM.ID_CLIENTE). Só uma sugestão... Falow.

Compartilhar este post


Link para o post
Compartilhar em outros sites

valeu é isso ai mesmo!

 

 

Bom, montei duas tabelas aqui, não sei se é isso que você precisa, mas lá vai:

 

CREATE TABLE BD_TESTES.CLIENTES (
   ID_CLIENTE INT(11) NOT NULL AUTO_INCREMENT COMMENT "ID do cliente",    
   NOME_CLIENTE VARCHAR(255) NOT NULL COMMENT "Nome do cliente",
   PRIMARY KEY (ID_CLIENTE)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

CREATE TABLE BD_TESTES.COMPRAS (
   ID_COMPRA INT(11) NOT NULL AUTO_INCREMENT COMMENT "ID da compra",
   VALOR NUMERIC(10,4) COMMENT "Valor da compra",    
   DATA_COMPRA DATETIME COMMENT "Data da compra",    
   ID_CLIENTE INT(11) COMMENT "Cliente que fez a compra",
   PRIMARY KEY (ID_COMPRA),    
   FOREIGN KEY (ID_CLIENTE)    
       REFERENCES CLIENTES(ID_CLIENTE)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

INSERT INTO CLIENTES(NOME_CLIENTE) VALUES ('Diego');
INSERT INTO CLIENTES(NOME_CLIENTE) VALUES ('João');
INSERT INTO CLIENTES(NOME_CLIENTE) VALUES ('José');
INSERT INTO CLIENTES(NOME_CLIENTE) VALUES ('Maria');

INSERT INTO COMPRAS(VALOR, DATA_COMPRA, ID_CLIENTE) VALUES(10,'2011-10-10',1);
INSERT INTO COMPRAS(VALOR, DATA_COMPRA, ID_CLIENTE) VALUES(20,'2011-10-13',1);
INSERT INTO COMPRAS(VALOR, DATA_COMPRA, ID_CLIENTE) VALUES(5,'2011-10-10',3);
INSERT INTO COMPRAS(VALOR, DATA_COMPRA, ID_CLIENTE) VALUES(2,'2011-10-01',2);
INSERT INTO COMPRAS(VALOR, DATA_COMPRA, ID_CLIENTE) VALUES(10,'2011-10-30',4);
INSERT INTO COMPRAS(VALOR, DATA_COMPRA, ID_CLIENTE) VALUES(7,'2011-10-18',3);
INSERT INTO COMPRAS(VALOR, DATA_COMPRA, ID_CLIENTE) VALUES(13,'2011-10-15',2);
INSERT INTO COMPRAS(VALOR, DATA_COMPRA, ID_CLIENTE) VALUES(15,'2011-10-25',2);

-- Com essa query abaixo eu retorno os dados das duas tabelas

SELECT CLI.ID_CLIENTE, CLI.NOME_CLIENTE, SUM(COM.VALOR), COUNT(COM.ID_CLIENTE) FROM CLIENTES AS CLI 
JOIN COMPRAS AS COM ON COM.ID_CLIENTE = CLI.ID_CLIENTE
GROUP BY COM.ID_CLIENTE

-- Note o retorno, ignore os valores não tava pensando muito nisso quando fiz os testes:

1 | Diego | 30.0000 | 2
2 | João  | 30.0000 | 3
3 | José  | 12.0000 | 2
4 | Maria | 10.0000 | 1

 

Isso me diz que:

 

O cliente de ID 1, chamado Diego, gastou 30.0000 em 2 compras.

O cliente de ID 2, chamado João, gastou 30.0000 em 3 compras.

O cliente de ID 3, chamado José, gastou 12.0000 em 2 compras.

O cliente de ID 4, chamado Maria, gastou 10.0000 em 1 compras.

 

Retorna nome, ID (opcional pra você eu acho), valor gasto e quantidade de compras. Agora só basta você adicionar o filtro de período. Exemplo:

 

SELECT CLI.ID_CLIENTE, CLI.NOME_CLIENTE, SUM(COM.VALOR), COUNT(COM.ID_CLIENTE) FROM CLIENTES AS CLI 
JOIN COMPRAS AS COM ON COM.ID_CLIENTE = CLI.ID_CLIENTE
WHERE COM.DATA_COMPRA BETWEEN '2011-10-09' AND '2011-10-18'
GROUP BY COM.ID_CLIENTE

 

Espero que seja mais ou menos isso, qualquer coisa posta aê =]

 

Abrass.

 

Edit:

 

Ah uma sugestão: Pode criar um campo na tabela CLIENTES que guarde o número de compras de cada cliente, aí você vai ter que controlar esse campo pela tua aplicação. É melhor que essa gambiarra que eu fiz de COUNT(COM.ID_CLIENTE). Só uma sugestão... Falow.

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.