Relatório de Vendas Agrupadas por Cliente
Estou querendo fazer um relatório que me traga o valor total de vendas para cada cliente(TOTAL_DO_CLIENTE), quantidade (QTDE_DO_ITEM) e valor vendido de cada produto (SOMA_VENDAS), ordenado pelo valor vendido(TOTAL_DO_CLIENTE).
A consulta abaixo faz quase isso, mas não traz o TOTAL_DO_CLIENTE.
Como ficaria uma instrução para fazer o que eu preciso?
´
SELECT CLIENTE, PRODUTO, NOMECLIENTE, DESCRICAO,
SUM(SUBTOTAL) AS SOMA_VENDAS, SUM(QUANTIDADE)AS QTDE_DO_ITEM
FROM VIEW_CURVA_ABC_PRODUTOS WHERE DATA
BETWEEN :VInicio AND :VFim GROUP BY 1,2,3,4
´
Obs.: sei que eu poderia colocar um RLDBResult e somar o valor SOMA_VENDAS de cada cliente, mas eu preciso que esse valor já seja trazido pela consulta, pois preciso ordenar os registros mostrando primeiro o cliente que tem o maior valor em vendas, ou seja, a soma do SOMA_VENDAS de todos os produtos que o cliente comprou.
Obrigado.
A consulta abaixo faz quase isso, mas não traz o TOTAL_DO_CLIENTE.
Como ficaria uma instrução para fazer o que eu preciso?
´
SELECT CLIENTE, PRODUTO, NOMECLIENTE, DESCRICAO,
SUM(SUBTOTAL) AS SOMA_VENDAS, SUM(QUANTIDADE)AS QTDE_DO_ITEM
FROM VIEW_CURVA_ABC_PRODUTOS WHERE DATA
BETWEEN :VInicio AND :VFim GROUP BY 1,2,3,4
´
Obs.: sei que eu poderia colocar um RLDBResult e somar o valor SOMA_VENDAS de cada cliente, mas eu preciso que esse valor já seja trazido pela consulta, pois preciso ordenar os registros mostrando primeiro o cliente que tem o maior valor em vendas, ou seja, a soma do SOMA_VENDAS de todos os produtos que o cliente comprou.
Obrigado.
Armindo
Curtidas 0
Respostas
Fortaum
03/01/2007
Olá...
SELECT CLIENTE, PRODUTO, NOMECLIENTE, DESCRICAO,
SUM(SUBTOTAL * QUANTIDADE) AS SOMA_VENDAS, SUM(QUANTIDADE)AS QTDE_DO_ITEM
FROM VIEW_CURVA_ABC_PRODUTOS WHERE DATA
BETWEEN :VInicio AND :VFim GROUP BY 1,2,3,4
- Acho q é isso...
SELECT CLIENTE, PRODUTO, NOMECLIENTE, DESCRICAO,
SUM(SUBTOTAL * QUANTIDADE) AS SOMA_VENDAS, SUM(QUANTIDADE)AS QTDE_DO_ITEM
FROM VIEW_CURVA_ABC_PRODUTOS WHERE DATA
BETWEEN :VInicio AND :VFim GROUP BY 1,2,3,4
- Acho q é isso...
GOSTEI 0
Armindo
03/01/2007
Obrigado pela resposta, mas não resolve. O dado SUBTOTAL já é o valor do produto multiplicado pelo seu valor unitário.
O que eu preciso é o total dos SOMA_VENDAS de todos os registros agrupado por cliente.
Vou dar um exemplo do que eu preciso:
Venda 1
- Cliente A;
- Produtos vendidos: 2 itens do produto X, a R$ 4,00 e 3 itens do produto Y, R$ a 5,00;
Venda 2
- Cliente A;
- Produtos vendidos: 4 itens do produto X, a R$ 3,00 e 6 itens do produto Y, R$ a 2,00;
Venda 3
- Cliente B;
- Produtos vendidos: 5 itens do produto X, a R$ 6,00 e 2 itens do produto Y, R$ a 4,00.
Do jeito que está, a consulta mostra os seguintes resultados:
Cliente A
- Produto X: SOMA_VENDAS = 20,00 e QTDE_DO_ITEM = 06;
- Produto Y: SOMA_VENDAS = 27,00 e QTDE_DO_ITEM = 09;
Cliente B
- Produto X: Valor = 30,00 e QTDE_DO_ITEM = 05;
- Produto Y: Valor = 8,00 e QTDE_DO_ITEM = 02;
O que eu preciso, além desses resultados é que me traga o valor total das vendas (TOTAL_DO_CLIENTE) a cada cliente. No caso Clienta A = R$ 47,00 e Cliente B = R$ 38,00
Qualquer idéia ajuda.
Obrigado
O que eu preciso é o total dos SOMA_VENDAS de todos os registros agrupado por cliente.
Vou dar um exemplo do que eu preciso:
Venda 1
- Cliente A;
- Produtos vendidos: 2 itens do produto X, a R$ 4,00 e 3 itens do produto Y, R$ a 5,00;
Venda 2
- Cliente A;
- Produtos vendidos: 4 itens do produto X, a R$ 3,00 e 6 itens do produto Y, R$ a 2,00;
Venda 3
- Cliente B;
- Produtos vendidos: 5 itens do produto X, a R$ 6,00 e 2 itens do produto Y, R$ a 4,00.
Do jeito que está, a consulta mostra os seguintes resultados:
Cliente A
- Produto X: SOMA_VENDAS = 20,00 e QTDE_DO_ITEM = 06;
- Produto Y: SOMA_VENDAS = 27,00 e QTDE_DO_ITEM = 09;
Cliente B
- Produto X: Valor = 30,00 e QTDE_DO_ITEM = 05;
- Produto Y: Valor = 8,00 e QTDE_DO_ITEM = 02;
O que eu preciso, além desses resultados é que me traga o valor total das vendas (TOTAL_DO_CLIENTE) a cada cliente. No caso Clienta A = R$ 47,00 e Cliente B = R$ 38,00
Qualquer idéia ajuda.
Obrigado
GOSTEI 0
Armindo
03/01/2007
E aí, ninguém tem uma dica?
GOSTEI 0
Xtreme
03/01/2007
E aí, ninguém tem uma dica?
E se voce fizer um subselect junto ao select somando o total do cliente!
tipo esse mas nao sei se ta certo:
SELECT A.CLIENTE, A.PRODUTO, A.NOMECLIENTE, A.DESCRICAO, SUM(A.SUBTOTAL) AS SOMA_VENDAS, SUM(A.QUANTIDADE)AS QTDE_DO_ITEM, (SELECT B.CLIENTE, SUM(B.SUBTOTAL) FROM VIEW_CURVA_ABC_PRODUTOS B WHERE B.CLIENTE = A.CLIENTE) FROM VIEW_CURVA_ABC_PRODUTOS A WHERE A.DATA BETWEEN :VInicio AND :VFim GROUP BY 1,2,3,4
GOSTEI 0
Emerson Nascimento
03/01/2007
só um detalhe: no caso apresentado, as subselects podem retornar apenas 1 campo. outra coisa a atentar-se é o intervalo de datas, que deve ser o mesmo.
SELECT A.CLIENTE, A.PRODUTO, A.NOMECLIENTE, A.DESCRICAO, SUM(A.SUBTOTAL) SOMA_VENDAS, SUM(A.QUANTIDADE) QTDE_DO_ITEM, (SELECT SUM(B.SUBTOTAL) FROM VIEW_CURVA_ABC_PRODUTOS B WHERE B.DATA BETWEEN :VInicio AND :VFim AND B.CLIENTE = A.CLIENTE) TOTAL_CLIENTE FROM VIEW_CURVA_ABC_PRODUTOS A WHERE A.DATA BETWEEN :VInicio AND :VFim GROUP BY 1,2,3,4
GOSTEI 0
Armindo
03/01/2007
só um detalhe: no caso apresentado, as subselects podem retornar apenas 1 campo. outra coisa a atentar-se é o intervalo de datas, que deve ser o mesmo.
SELECT A.CLIENTE, A.PRODUTO, A.NOMECLIENTE, A.DESCRICAO, SUM(A.SUBTOTAL) SOMA_VENDAS, SUM(A.QUANTIDADE) QTDE_DO_ITEM, (SELECT SUM(B.SUBTOTAL) FROM VIEW_CURVA_ABC_PRODUTOS B WHERE B.DATA BETWEEN :VInicio AND :VFim AND B.CLIENTE = A.CLIENTE) TOTAL_CLIENTE FROM VIEW_CURVA_ABC_PRODUTOS A WHERE A.DATA BETWEEN :VInicio AND :VFim GROUP BY 1,2,3,4
Funcionar funciona. Só que ficou muito lenta a consulta. O que poderia se fazer para melhorar a performance?
Obrigado.
GOSTEI 0
Emerson Nascimento
03/01/2007
o problema pode estar na View ou na falta de índices apropriados para a consulta.
GOSTEI 0
Armindo
03/01/2007
A view é a seguinte:
CREATE VIEW VIEW_CURVA_ABC_PRODUTOS(
PRODUTO,
DATA,
DESCRICAO,
SUBTOTAL,
QUANTIDADE,
CLIENTE,
NOMECLIENTE)
AS
SELECT VENDADETALHE.PRODUTO, VENDAMESTRE.DATA, PRODUTOS.DESCRICAO AS DESCRICAOPRODUTO, VENDADETALHE.SUBTOTAL, VENDADETALHE.QUANTIDADE, VENDAMESTRE.CLIENTE, CLIENTES.NOME AS NOMECLIENTE FROM VENDAMESTRE INNER JOIN VENDADETALHE ON (VENDAMESTRE.CODIGOMESTRE = VENDADETALHE.CODIGOMESTRE) INNER JOIN PRODUTOS ON (VENDADETALHE.PRODUTO = PRODUTOS.CODIGO) INNER JOIN CLIENTES ON (VENDAMESTRE.CLIENTE = CLIENTES.CODIGO) WHERE VENDACANCELADA IS NULL UNION ALL SELECT SERVICOPECAS.PRODUTO, SERVICOMESTRE.DATA, PRODUTOS.DESCRICAO AS DESCRICAOPRODUTO, SERVICOPECAS.SUBTOTAL, SERVICOPECAS.QUANTIDADE, SERVICOMESTRE.CLIENTE, CLIENTES.NOME AS NOMECLIENTE FROM SERVICOMESTRE INNER JOIN SERVICOPECAS ON (SERVICOMESTRE.CODIGOMESTRE = SERVICOPECAS.CODIGOMESTRE) INNER JOIN PRODUTOS ON (SERVICOPECAS.PRODUTO = PRODUTOS.CODIGO) INNER JOIN CLIENTES ON (SERVICOMESTRE.CLIENTE = CLIENTES.CODIGO)WHERE OSCANCELADA IS NULL;
Só tenho índice primário nas tabelas (pelo código). Será isso?
Oibrigado
CREATE VIEW VIEW_CURVA_ABC_PRODUTOS(
PRODUTO,
DATA,
DESCRICAO,
SUBTOTAL,
QUANTIDADE,
CLIENTE,
NOMECLIENTE)
AS
SELECT VENDADETALHE.PRODUTO, VENDAMESTRE.DATA, PRODUTOS.DESCRICAO AS DESCRICAOPRODUTO, VENDADETALHE.SUBTOTAL, VENDADETALHE.QUANTIDADE, VENDAMESTRE.CLIENTE, CLIENTES.NOME AS NOMECLIENTE FROM VENDAMESTRE INNER JOIN VENDADETALHE ON (VENDAMESTRE.CODIGOMESTRE = VENDADETALHE.CODIGOMESTRE) INNER JOIN PRODUTOS ON (VENDADETALHE.PRODUTO = PRODUTOS.CODIGO) INNER JOIN CLIENTES ON (VENDAMESTRE.CLIENTE = CLIENTES.CODIGO) WHERE VENDACANCELADA IS NULL UNION ALL SELECT SERVICOPECAS.PRODUTO, SERVICOMESTRE.DATA, PRODUTOS.DESCRICAO AS DESCRICAOPRODUTO, SERVICOPECAS.SUBTOTAL, SERVICOPECAS.QUANTIDADE, SERVICOMESTRE.CLIENTE, CLIENTES.NOME AS NOMECLIENTE FROM SERVICOMESTRE INNER JOIN SERVICOPECAS ON (SERVICOMESTRE.CODIGOMESTRE = SERVICOPECAS.CODIGOMESTRE) INNER JOIN PRODUTOS ON (SERVICOPECAS.PRODUTO = PRODUTOS.CODIGO) INNER JOIN CLIENTES ON (SERVICOMESTRE.CLIENTE = CLIENTES.CODIGO)WHERE OSCANCELADA IS NULL;
Só tenho índice primário nas tabelas (pelo código). Será isso?
Oibrigado
GOSTEI 0