Fórum Urgênte #404528
07/07/2011
0
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
Curtir tópico
+ 0Posts
07/07/2011
Eliel Martins
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
Gostei + 0
07/07/2011
Sidney Abreu
Gostei + 0
07/07/2011
Sidney Abreu
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
Gostei + 0
07/07/2011
Emerson Nascimento
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.
Gostei + 0
07/07/2011
Sidney Abreu
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)
);
Gostei + 0
07/07/2011
Emerson Nascimento
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
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)