Fórum Relatório de Vendas Agrupadas por Cliente #57576

03/01/2007

0

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.


Armindo

Armindo

Responder

Posts

04/01/2007

Fortaum

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...


Responder

Gostei + 0

04/01/2007

Armindo

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


Responder

Gostei + 0

08/01/2007

Armindo

E aí, ninguém tem uma dica?


Responder

Gostei + 0

08/01/2007

Xtreme

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



Responder

Gostei + 0

08/01/2007

Emerson Nascimento

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



Responder

Gostei + 0

08/01/2007

Armindo

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.


Responder

Gostei + 0

08/01/2007

Emerson Nascimento

o problema pode estar na View ou na falta de índices apropriados para a consulta.


Responder

Gostei + 0

08/01/2007

Armindo

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


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar