Fórum Urgênte #404528

07/07/2011

0

Pessoal estou precisando da ajuda de vocês, é o seguinte: eu tenho uma tabela de Vendas,vendedores, clientes e Rotas, onde os vendedores todos os dias saem com uma rota definida para visitar clientes, ou seja,  ele vai visitar todos os clientes daquela rota. Eu preciso saber quantos e quais os clientes que compraram daquela determinada rota e quais não compraram. tem como?

Eu uso firebird2.1. As minhas tabelas estão abaixo:

CREATE TABLE CLIENTES (
    CLI_ID           INTEGER NOT NULL
    CLI_RAZAO        VARCHAR(50) COLLATE PT_BR,
    ROTA_ID          DM_FK /* DM_FK = INTEGER */,
    VEND_ID          DM_FK /* DM_FK = INTEGER */
);


CREATE TABLE VENDAS (
    VEN_ID           INTEGER NOT NULL,
    VEND_ID          INTEGER,
    CLI_ID           INTEGER
    DATA_INC         DATE,
    ROTA_ID          DM_FK /* DM_FK = INTEGER */
);

CREATE TABLE ROTAS(
     ROTA_ID          INTEGER NOT NULL,
     ROTA               VARCHAR(50)
);

CREATE TABLE VENDEDOR(
     VEND_ID          INTEGER NOT NULL,
     VENDEDOR       VARCHAR(50)
);

Sidney Abreu

Sidney Abreu

Responder

Posts

07/07/2011

Eliel Martins

  Olá Sidney !

  Você está precisando do sql para listar essas vendas por rota, se for isso, segue abaixo o sql :

 
SELECT V.VEN_ID, C.CLI_RAZAO, V.DATA_INC, R.ROTA 
   FROM VENDAS             V 
  INNER JOIN  ROTAS      R ON  (V.ROTA_ID = R.ROTA_ID)
  INNER JOIN  CLIENTES C ON (V.CLI_ID  = C.CLI_ID)
WHERE V.ROTA_ID = :PROTA 
 



  Espero ter ajudado.


  Eliel G. Martins
Responder

Gostei + 0

07/07/2011

Sidney Abreu

Amigo obrigado pela ajuda, mas eu preciso saber quais os clientes que compraram e os que NAO compraram
Responder

Gostei + 0

07/07/2011

Sidney Abreu

O Select seria mais ou menos assim:
    select 
        COUNT(clientes.cli_id) as Qtde_Comp,
        (select count(clientes.cli_id) from clientes where clientes.rota_id = :rota) as Qtde_Rota,
       ( (select count(clientes.cli_id) from clientes where clientes.rota_id = :rota)-COUNT(clientes.cli_id)) as Qtde_Nao_Comp
    from vendas
       inner join clientes on (vendas.cli_id = clientes.cli_id)
       inner join rotas on (vendas.rota_id = rotas.rota_id)
    where
        clientes.ativo = 'A' and
        vendas.data_inc between :Dt_Ini and :Dt_Fim and
        vendas.rota_id = :rota


Só que o resultado desse select eu tenho que informar a rota e ele só me traz uma linha de cada vez.

eu preciso que ele liste todas as rotas dos clientes e faça esse calculo que esta no select.

Qtde_Rota é a quantidade de clientes da rota.

O Resulta teria que ser assim:

ROTA    Qtde_Rota     Qtde_Comp     Qtde_Nao_Comp
  A1           14                    10                        4
  A2           100                   90                     10
  A3            28                     8                        20

Responder

Gostei + 0

07/07/2011

Emerson Nascimento

me parece que o relacionamento da rota PRECISA ser com o cliente e não com a venda.
senão você só vai listar vendas e as colunas QTDE_ROTA e QTDE_COMP serão sempre iguais.

partindo desse princípio, montei a seguinte instrução:

select
  rotas.rota_codigo,
  count(distinct clientes.cli_id) as Qtde_Rota,
  count(distinct vendas.cli_id) as Qtde_Comp,
  (count(distinct clientes.cli_id) - count(distinct vendas.cli_id)) as Qtde_Nao_Comp
from
  clientes
inner join
  rotas on (rotas.rota_id = clientes.rota_id)
left join
  vendas on (vendas.cli_id = clientes.cli_id and vendas.rota_id = clientes.rota_id)
where
  clientes.ativo = 'A'
  and vendas.data_inc between :Dt_Ini and :Dt_Fim
group by
  rotas.rota_codigo

para sugerir uma instrução com maior precisão é necessário que você publique a estrutura das tabelas envolvidas.

Responder

Gostei + 0

07/07/2011

Sidney Abreu

Emerson obrigado por ajudar, mais ainda não deu certo. Os resultados são iguais, segue abaixo a extrutura das tabelas:

CREATE TABLE ROTAS (
    ROTA_ID         INTEGER NOT NULL PRIMARY KEY,
    ROTA_DESCRICAO  DM_APELIDO /* DM_APELIDO = VARCHAR(30) */,
    USU_ID          DM_FK /* DM_FK = INTEGER */,
    EMPRESA_ID      DM_FK /* DM_FK = INTEGER */,
    ROTA_BAIRRO     VARCHAR(80),
    DATA_INC        DM_DATA /* DM_DATA = DATE */,
    DATA_ALT        DM_DATA /* DM_DATA = DATE */
);


CREATE TABLE CLIENTES (
    CLI_ID           INTEGER NOT NULL PRIMARY KEY,
    CLI_PESSOA       CHAR(2) COLLATE PT_BR,
    CLI_RAZAO        VARCHAR(50) COLLATE PT_BR,
    CLI_APELIDO      VARCHAR(50) COLLATE PT_BR,
    CLI_END          VARCHAR(40) COLLATE PT_BR,
    CLI_BAIRRO       VARCHAR(25) COLLATE PT_BR,
    CLI_CIDADE       VARCHAR(30) COLLATE PT_BR,
    CLI_COMPL        VARCHAR(40) COLLATE PT_BR,
    CLI_UF           INTEGER,
    CLI_CEP          VARCHAR(11) COLLATE PT_BR,
    CLI_FONE         VARCHAR(12) COLLATE PT_BR,
    CLI_FAX          VARCHAR(12) COLLATE PT_BR,
    CLI_CEL          VARCHAR(12) COLLATE PT_BR,
    CLI_EST_CIVIL    CHAR(3) COLLATE PT_BR,
    CLI_CPF          VARCHAR(14) COLLATE PT_BR,
    CLI_CNPJ         VARCHAR(18) COLLATE PT_BR,
    CLI_CGF          VARCHAR(15) COLLATE PT_BR,
    CLI_EMAIL        DM_END COLLATE PT_BR /* DM_END = VARCHAR(50) */,
    DATA_INC_CLI     DATE,
    DATA_ALT         DATE,
    CLI_OBS          VARCHAR(100) COLLATE PT_BR,
    ATIVO            CHAR(1) COLLATE PT_BR,
    EMPRESA_ID       INTEGER,
    CLI_DT_PRI_COM   DM_DATA /* DM_DATA = DATE */,
    CLI_DT_ULT_COM   DM_DATA /* DM_DATA = DATE */,
    CLI_VR_PRI_COM   DM_VALOR /* DM_VALOR = NUMERIC(15,2) */,
    CLI_VR_ULT_COM   DM_VALOR /* DM_VALOR = NUMERIC(15,2) */,
    CLI_VEN_PRI_COM  DM_FK /* DM_FK = INTEGER */,
    CLI_VEN_ULT_COM  DM_FK /* DM_FK = INTEGER */,
    NOME_ENT         DM_NOME COLLATE PT_BR /* DM_NOME = VARCHAR(50) */,
    END_ENT          DM_END COLLATE PT_BR /* DM_END = VARCHAR(50) */,
    BAIRRO_ENT       DM_BAIRRO COLLATE PT_BR /* DM_BAIRRO = VARCHAR(25) */,
    CIDADE_ENT       DM_APELIDO COLLATE PT_BR /* DM_APELIDO = VARCHAR(30) */,
    UF_ENT           DM_FK /* DM_FK = INTEGER */,
    ENT_CEP          DM_CEP COLLATE PT_BR /* DM_CEP = CHAR(9) */,
    ENT_CNPJ         DM_CNPJ COLLATE PT_BR /* DM_CNPJ = VARCHAR(18) */,
    ENT_CGF          DM_CGF COLLATE PT_BR /* DM_CGF = VARCHAR(15) */,
    ENT_CONTATO      DM_APELIDO COLLATE PT_BR /* DM_APELIDO = VARCHAR(30) */,
    ENT_FONE         DM_FONE COLLATE PT_BR /* DM_FONE = VARCHAR(12) */,
    USU_ID           DM_FK /* DM_FK = INTEGER */,
    DATA_NASC        DM_DATA /* DM_DATA = DATE */,
    VIZINHO1         DM_APELIDO COLLATE PT_BR /* DM_APELIDO = VARCHAR(30) */,
    VIZINHO2         DM_APELIDO /* DM_APELIDO = VARCHAR(30) */,
    PONTORFERENCIA   DM_NOME COLLATE PT_BR /* DM_NOME = VARCHAR(50) */,
    PAI              DM_NOME COLLATE PT_BR /* DM_NOME = VARCHAR(50) */,
    MAE              DM_NOME COLLATE PT_BR /* DM_NOME = VARCHAR(50) */,
    CONJUGE          DM_NOME COLLATE PT_BR /* DM_NOME = VARCHAR(50) */,
    NOME_EMPRESA     DM_NOME COLLATE PT_BR /* DM_NOME = VARCHAR(50) */,
    CARGO            DM_BAIRRO COLLATE PT_BR /* DM_BAIRRO = VARCHAR(25) */,
    RENDA            DM_VALOR /* DM_VALOR = NUMERIC(15,2) */,
    OUTRASRENDAS     DM_VALOR /* DM_VALOR = NUMERIC(15,2) */,
    REFERENCIA1      DM_NOME COLLATE PT_BR /* DM_NOME = VARCHAR(50) */,
    REFERENCIA2      DM_NOME COLLATE PT_BR /* DM_NOME = VARCHAR(50) */,
    FONEREF1         DM_FONE COLLATE PT_BR /* DM_FONE = VARCHAR(12) */,
    FONEREF2         DM_FONE COLLATE PT_BR /* DM_FONE = VARCHAR(12) */,
    FIADOR           DM_NOME COLLATE PT_BR /* DM_NOME = VARCHAR(50) */,
    FIADOR_FONE      DM_FONE COLLATE PT_BR /* DM_FONE = VARCHAR(12) */,
    FIADOR_CPF       DM_CGF COLLATE PT_BR /* DM_CGF = VARCHAR(15) */,
    SETOR_ID         DM_FK /* DM_FK = INTEGER */,
    ROTA_ID          DM_FK /* DM_FK = INTEGER */,
    VEND_ID          DM_FK /* DM_FK = INTEGER */,
    CLI_ORDER        VARCHAR(4),
    CARTAZ           CHAR(1) DEFAULT 'N',
    DATA_ENTREGA     DATE
);


CREATE TABLE VENDAS (
    VEN_ID           INTEGER NOT NULL PRIMARY KEY,
    VEND_ID          INTEGER,
    CLI_ID           INTEGER,
    SITUACAO_ID      INTEGER,
    FGPTO_ID         INTEGER,
    EMPRESA_ID       INTEGER,
    DATA_INC         DATE,
    DATA_ALT         DATE,
    DATA_BAIXA       DATE,
    VEN_DATA_VENC    DATE,
    VEN_PLANO1       INTEGER,
    VEN_PLANO2       INTEGER,
    VEN_TOTAL1       NUMERIC(15,2),
    VEN_TOTAL2       NUMERIC(15,2),
    VEN_FGPTO1       INTEGER,
    VEN_FGPTO2       INTEGER,
    VEN_VALOR_TOTAL  NUMERIC(15,2),
    VEN_NUMPARC      INTEGER,
    VEN_VALORPARC    NUMERIC(15,2),
    VEN_TOTALPARC    NUMERIC(15,2),
    VEN_OBS          VARCHAR(50),
    USU_ID           DM_FK /* DM_FK = INTEGER */,
    BANCO_ID         DM_FK /* DM_FK = INTEGER */,
    NUM_CHEQUE       VARCHAR(8),
    TITULAR_CHEQUE   DM_NOME COLLATE PT_BR /* DM_NOME = VARCHAR(50) */,
    ROTA_ID          DM_FK /* DM_FK = INTEGER */,
    CEDULA1          DM_VALOR /* DM_VALOR = NUMERIC(15,2) */,
    CEDULA2          DM_VALOR /* DM_VALOR = NUMERIC(15,2) */,
    MOEDA1           DM_VALOR /* DM_VALOR = NUMERIC(15,2) */,
    MOEDA2           DM_VALOR /* DM_VALOR = NUMERIC(15,2) */,
    OPERACAO         VARCHAR(1),
    CANCELADO        VARCHAR(1)
);

Responder

Gostei + 0

07/07/2011

Emerson Nascimento

talvez o problema esteja na condição. na verdade ONDE ela foi colocada.

tire do where e leve para o join. assim:

select
  rotas.rota_id, rotas.rota_descricao,
  count(distinct clientes.cli_id) as Qtde_Rota,
  count(distinct vendas.cli_id) as Qtde_Comp,
  (count(distinct clientes.cli_id) - count(distinct vendas.cli_id)) as Qtde_Nao_Comp
from
  clientes
inner join
  rotas on (rotas.rota_id = clientes.rota_id)
left join
  vendas on (vendas.cli_id = clientes.cli_id and vendas.rota_id = clientes.rota_id
  and vendas.data_inc between :Dt_Ini and :Dt_Fim)
where
  clientes.ativo = 'A'
group by
  rotas.rota_id, rotas.rota_descricao


ou assim:


select
  rotas.rota_id, rotas.rota_descricao,
  count(distinct clientes.cli_id) as Qtde_Rota,
  sum(case when vendas.cli_id is null 0 else 1 end) as Qtde_Comp,
  (count(distinct clientes.cli_id) - sum(case when vendas.cli_id is null 0 else 1 end)) as Qtde_Nao_Comp
from
  clientes
inner join
  rotas on (rotas.rota_id = clientes.rota_id)
left join
  vendas on (vendas.cli_id = clientes.cli_id and vendas.rota_id = clientes.rota_id
  and vendas.data_inc between :Dt_Ini and :Dt_Fim)
where
  clientes.ativo = 'A'
group by
  rotas.rota_id, rotas.rota_descricao
Responder

Gostei + 0

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

Aceitar