- Fórum
- Protheus/Microsiga/Totvs
- AdvPL (Advanced Protheus Language)
- Dúvidas Gerais
- Query usando 3 tabelas
×
Linguagem de Programação ADVPL
Perguntas Query usando 3 tabelas
- Idalicio
- Autor do Tópico
- Desconectado
- Membro Júnior
Menos
Mais
- Postagens: 23
- Obrigados Recebidos: 0
11 anos 7 meses atrás #12644
por Idalicio
Query usando 3 tabelas foi criado 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
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.
- kanaamlrr
- Desconectado
- Membro Platina
Menos
Mais
- Postagens: 1576
- Obrigados Recebidos: 4
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.
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.
- Idalicio
- Autor do Tópico
- Desconectado
- Membro Júnior
Menos
Mais
- Postagens: 23
- Obrigados Recebidos: 0
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
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.
- lalberto
- Desconectado
- Administrador
Menos
Mais
- Postagens: 3676
- Obrigados Recebidos: 6
11 anos 7 meses atrás #12660
por lalberto
Luiz Alberto Vieira Alves
Proprietário
55 (12) 9 8256-5905 (Vivo)
www.3lsystems.com.br
www.masteradvpl.com.br
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
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.
- Idalicio
- Autor do Tópico
- Desconectado
- Membro Júnior
Menos
Mais
- Postagens: 23
- Obrigados Recebidos: 0
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.
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.
- lalberto
- Desconectado
- Administrador
Menos
Mais
- Postagens: 3676
- Obrigados Recebidos: 6
11 anos 7 meses atrás #12665
por lalberto
Luiz Alberto Vieira Alves
Proprietário
55 (12) 9 8256-5905 (Vivo)
www.3lsystems.com.br
www.masteradvpl.com.br
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
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.
- Fórum
- Protheus/Microsiga/Totvs
- AdvPL (Advanced Protheus Language)
- Dúvidas Gerais
- Query usando 3 tabelas
Tempo para a criação da página:0.145 segundos