× Linguagem de Programação ADVPL

Perguntas Query usando 3 tabelas

Mais
11 anos 7 meses atrás #12644 por Idalicio
Bom dia...

Preciso de uma ajuda com uma Query. Se alguém que entende bem do SQL poder me dar uma ajuda fico grato.

Tabelas envolvidas:

SA1000 - Clientes
SD2000 - Vendas
SZA000 - Vendas Antigas

Na tabela SZA000 pode haver registros que constam no SD2000 também, ou seja; registros duplicados.

Eu preciso fazer uma query para saber se vai bater com o relatório que eu fiz onde eu trato estas duplicidades.

Não sei se tem como fazer isso.

Ele tem que pegar a tabela SA1000 (clientes) pela data de cadastro exemplo. de 08/04/2004 a 08/04/2013 e buscar as vendas destes clientes
na tabela SD2000(venda atual), depois pesquisar também na SZA000(vendas antigas), cuidando para não pegar os registros duplicados e agrupar por cliente.

No relatório eu fiz mas queria checar a confiabilidade da informação via SQL.


Segue algumas informações:

A query tem que ler primeiro do SA1000 onde tem o campo A1_DTCADAS, juntamente com o campo A1_COD, na tabela SD2000 tem o campo D2_CLIENTE que é igual ao conteúdo do campo A1_COD, assim como também na tabela SZA000 que também tem o campo ZA_CLIENTE, que também é igual ao conteúdo do campo A1_COD.

Entre as tabelas SD2000 E SZA000 o conteúdo dos campos são os mesmos para pesquisa.

SD2000 SZA000
CAMPO CAMPO

D2_FILIAL ZA_FILIAL
D2_EMISSAO ZA_EMISSAO
D2_DOC ZA_DOC
D2_SERIE ZA_SERIE
D2_CLIENTE ZA_CLIENTE
D2_NOME ZA_NOME
D2_LOJA ZA_LOJA
D2_QUANT ZA_QUANT
D2_COD ZA_COD
D2_DESC ZA_DESC
D2_ITEM ZA_ITEM
D2_GRUPO ZA_GRUPO
D2_TP ZA_TP
D2_TES ZA_TES

Por favor Acessar ou Registrar para participar da conversa.

Mais
11 anos 7 meses atrás - 11 anos 7 meses atrás #12647 por kanaamlrr
Respondido por kanaamlrr no tópico Query usando 3 tabelas
Faz um select mais ou menos assim:


SELECT * FROM
(
SELECT D2_FILIAL AS FILIAL, D2_EMISSAO AS EMISSAO, ... (TODOS OS CAMPOS)
FROM SD2000 INNER JOIN SA1000
ON D2_CLIENTE = A1_COD AND D2_LOJA = A1_LOJA
WHERE
A1_DTCADAS BETWEEN DATA1 AND DATA2
UNION ALL
SELECT ZA_FILIAL AS FILIAL, ZA_EMISSAO AS EMISSAO, ... (TODOS OS CAMPOS)
FROM SZA000 INNER JOIN SA1000
ON ZA_CLIENTE = A1_COD AND D2_LOJA = A1_LOJA
WHERE
A1_DTCADAS BETWEEN DATA1 AND DATA2

) AS Q
GROUP BY FILIAL, EMISSAO, DOC, SERIE, CLIENTE, ... (TODOS OS CAMPOS)

poderia fazer usando um outter join também..
mas acho que isso deve resolver.
faz o teste ae e diz pra gente como ficou.
Ultima edição: 11 anos 7 meses atrás por kanaamlrr.

Por favor Acessar ou Registrar para participar da conversa.

Mais
11 anos 7 meses atrás #12659 por Idalicio
Respondido por Idalicio no tópico Query usando 3 tabelas
Fiz a query com as alterações e trouxe as informações sim.

Quanto aos registros duplicados não vou ter problema já que preciso que seja agrupado por cliente e não por item.

Então agora eu só preciso agrupar por cliente para eu saber quantos clientes se enquadram dentro do solicitado.

Idalício.

*****************************************************************

SELECT * FROM
(SELECT D2_FILIAL AS FILIAL, D2_EMISSAO AS EMISSAO, D2_LOJA AS LOJA, D2_DOC AS DOC, D2_SERIE AS SERIE, D2_CLIENTE AS CLIENTE, D2_TES AS TES
FROM SD2000 INNER JOIN SA1000
ON D2_CLIENTE = A1_COD AND D2_LOJA = A1_LOJA
WHERE
(D2_TES = '501' OR D2_TES = '502') AND
A1_DTCADAS BETWEEN 20110101 AND 20130131
UNION ALL
SELECT ZA_FILIAL AS FILIAL, ZA_EMISSAO AS EMISSAO, ZA_LOJA AS LOJA, ZA_DOC AS DOC, ZA_SERIE AS SERIE, ZA_CLIENTE AS CLIENTE, ZA_TES AS TES
FROM SZA000 INNER JOIN SA1000
ON ZA_CLIENTE = A1_COD AND ZA_LOJA = A1_LOJA
WHERE
(ZA_TES = '501' OR ZA_TES = '502') AND
A1_DTCADAS BETWEEN 20110101 AND 20130131) AS Q
GROUP BY FILIAL, EMISSAO, LOJA, DOC, SERIE, CLIENTE, TES

Por favor Acessar ou Registrar para participar da conversa.

Mais
11 anos 7 meses atrás #12660 por lalberto
Respondido por lalberto no tópico Query usando 3 tabelas
Veja se com DISTINCT ajusta.


SELECT * FROM
(SELECT DISTINCT D2_FILIAL AS FILIAL, D2_EMISSAO AS EMISSAO, D2_LOJA AS LOJA, D2_DOC AS DOC, D2_SERIE AS SERIE, D2_CLIENTE AS CLIENTE, D2_TES AS TES
FROM SD2000 INNER JOIN SA1000
ON D2_CLIENTE = A1_COD AND D2_LOJA = A1_LOJA
WHERE
(D2_TES = '501' OR D2_TES = '502') AND
A1_DTCADAS BETWEEN 20110101 AND 20130131
UNION ALL
SELECT DISTINCT ZA_FILIAL AS FILIAL, ZA_EMISSAO AS EMISSAO, ZA_LOJA AS LOJA, ZA_DOC AS DOC, ZA_SERIE AS SERIE, ZA_CLIENTE AS CLIENTE, ZA_TES AS TES
FROM SZA000 INNER JOIN SA1000
ON ZA_CLIENTE = A1_COD AND ZA_LOJA = A1_LOJA
WHERE
(ZA_TES = '501' OR ZA_TES = '502') AND
A1_DTCADAS BETWEEN 20110101 AND 20130131) AS Q
GROUP BY FILIAL, EMISSAO, LOJA, DOC, SERIE, CLIENTE, TES

Luiz Alberto Vieira Alves
Proprietário
55 (12) 9 8256-5905 (Vivo)
www.3lsystems.com.br
www.masteradvpl.com.br

Por favor Acessar ou Registrar para participar da conversa.

Mais
11 anos 7 meses atrás #12664 por Idalicio
Respondido por Idalicio no tópico Query usando 3 tabelas
Sim. Neste caso usando o DISTINCT ele não trás os itens duplicados. Mas ele me mostra o total de itens das notas que ele encontrou e eu preciso saber quantos clientes ele achou. Da forma que esta se o cliente veio várias vezes na loja ou comprou mais de um item na nota ele vai repetir o total de registros que o cliente teve. Indiferente se o cliente comprou 5 vezes eu preciso saber que ele veio na loja com isso ao invés de 5 registros ele me mostraria somente 1.

Não sei se vocês estão conseguindo entender o que estou dizendo.

Idalício.

Por favor Acessar ou Registrar para participar da conversa.

Mais
11 anos 7 meses atrás #12665 por lalberto
Respondido por lalberto no tópico Query usando 3 tabelas
VEJA SE FUNFA AI:

SELECT * FROM
(SELECT DISTINCT D2_FILIAL AS FILIAL, D2_EMISSAO AS EMISSAO, D2_LOJA AS LOJA, D2_DOC AS DOC, D2_SERIE AS SERIE, D2_CLIENTE AS CLIENTE, D2_TES AS TES
FROM SD2000 INNER JOIN SA1000 ON D2_CLIENTE = A1_COD AND D2_LOJA = A1_LOJA WHERE (D2_TES = '501' OR D2_TES = '502') AND
A1_DTCADAS BETWEEN '20110101' AND '20130131'
UNION ALL
SELECT DISTINCT ZA_FILIAL AS FILIAL, ZA_EMISSAO AS EMISSAO, ZA_LOJA AS LOJA, ZA_DOC AS DOC, ZA_SERIE AS SERIE, ZA_CLIENTE AS CLIENTE, ZA_TES AS TES
FROM SZA000 INNER JOIN SA1000
ON ZA_CLIENTE = A1_COD AND ZA_LOJA = A1_LOJA
WHERE (ZA_TES = '501' OR ZA_TES = '502') AND A1_DTCADAS BETWEEN '20110101' AND '20130131'
AND NOT EXISTS(SELECT 'Z' FROM SD2000 D2 INNER JOIN SA1000 A1 ON D2.D2_CLIENTE = A1.A1_COD AND D2.D2_LOJA = A1.A1_LOJA
WHERE (D2.D2_TES = '501' OR D2.D2_TES = '502') AND
A1.A1_DTCADAS BETWEEN '20110101' AND '20130131' AND ZA_DOC = D2.D2_DOC)
) AS Q
GROUP BY FILIAL, EMISSAO, LOJA, DOC, SERIE, CLIENTE, TES

Luiz Alberto Vieira Alves
Proprietário
55 (12) 9 8256-5905 (Vivo)
www.3lsystems.com.br
www.masteradvpl.com.br

Por favor Acessar ou Registrar para participar da conversa.

Tempo para a criação da página:0.212 segundos
Joomla templates by a4joomla