[RESOLVIDO] select + sum()

3 respostas
Onimatsu

Boa noite.
Estou tentando fazer um comando de select para mostrar o cliente e o valor total de todas as compras para isso estou multiplicando a quantidade de itens que ele comprou pelo valor do produto e somando o resultado caso o cliente tenha várias ocorrências, já que o mesmo cliente pode realizar várias compras. O problema é que o código está somando o valor de todos os clientes.

A tabela venda importa o id do cliente e do produto:
create table cliente (
    id_cliente smallint unsigned auto_increment,
    nome varchar(40),
    endereco char(100),
    telefone char(13),
    cidade char(30),
    primary key (id_cliente)
);

create table produto (
    id_produto smallint unsigned auto_increment,
    nome varchar(40),
    preco real,
    quantidade int,
    primary key (id_produto)
);

create table venda (
    id_venda smallint unsigned auto_increment,
    id_cliente smallint unsigned,
    id_produto smallint unsigned,
    id_vendedor smallint unsigned,
    quantidade_itens int,
    numero_parcelas int,
    data_venda timestamp default current_timestamp,
    primary key (id_venda),
    foreign key (id_cliente)
        references cliente (id_cliente),
    foreign key (id_produto)
        references produto (id_produto),
    foreign key (id_vendedor)
        references vendedor (id_vendedor)
);
A tabela de venda possui os seguintes dados: [IMG]http://imageshack.us/a/img35/7616/1l74.jpg[/IMG] Faço o comando:
select c.nome, sum(p.preco * v.quantidade_itens) 
	from cliente c, venda v, produto p
	where c.id_cliente = v.id_cliente and p.id_produto = v.id_produto;
Supondo que o produto de código 1 têm valor 10, e que o cliente A possui código 1 e o B código 2 queria retornar uma lista de resultado com os valores: -- Resultado esperado cliente A, 50 cliente B, 20

O que eu preciso mudar no código?

3 Respostas

pmlm

Tens de usar GROUP BY.

select c.nome, sum(p.preco * v.quantidade_itens) from cliente c, venda v, produto p where c.id_cliente = v.id_cliente and p.id_produto = v.id_produto group by c.nome;

pmlm

Nota que para garantires que realmente somas por cliente e não juntas dois clientes diferentes com o mesmo nome em um só deves agrupar por id e não por nome.

Onimatsu

Muito obrigado!
Sabia que faltava alguma coisa bem simples, mas não conseguia identificar agrupei pelo código e deu certo.
Abraços.

Criado 3 de dezembro de 2013
Ultima resposta 3 de dez. de 2013
Respostas 3
Participantes 2