Usuário com melhor resposta
colocar mais 1 tabela na minha consulta

Pergunta
-
Como colocar a tabela CONTATOS na minha consulta abaixo:
SELECT * FROM HISTCATREV H INNER JOIN CLIENTES C ON
H.CODIGOTIPO = C.CODIGO
WHERE (H.TIPO = 'R' AND H.REVISTA = '001') OR
(H.TIPO = 'C' AND H.CATEGORIA = 'CON')A condição seria H.CODIGO = CONTATOS.CLIENTE
Fico no aguardo
Obrigado.
Respostas
-
Experimente dessa forma:
with CTE_Count as ( SELECT H.CODIGOTIPO,H.CATEGORIA,H.REVISTA,H.TIPO,C.RAZAO,CT.EMAIL, COUNT(CASE WHEN H.TIPO = 'R' THEN 1 END) OVER(PARTITION BY H.CODIGOTIPO) AS QtdR, COUNT(CASE WHEN H.TIPO = 'C' THEN 1 END) OVER(PARTITION BY H.CODIGOTIPO) AS QtdC FROM HISTCATREV H INNER JOIN CLIENTES C ON H.CODIGOTIPO = C.CODIGO INNER JOIN CONTATOS CT ON H.CODIGOTIPO = CT.CLIENTE WHERE (H.TIPO = 'R' AND H.REVISTA = '001') OR (H.TIPO = 'C' AND H.CATEGORIA = 'CON') ) SELECT * FROM CTE_Count WHERE QtdR > 0 and QtdC > 0 ORDER BY CODIGOTIPO
Espero que ajude.
Assinatura: http://www.imoveisemexposicao.com.br
- Marcado como Resposta ricardoti2012 terça-feira, 28 de julho de 2015 18:03
Todas as Respostas
-
-
Seria isso? No caso o interessante seria ter a certeza do relacionamento entre estas tabelas, pelo o que exemplificou, entendi que esse pode ser o resultado.
select * from
histcatrev h inner join
cliente c on (h.codigotipo = c.codigo) inner join
contatos ct on (h.codigo = ct.cliente)
where
... ;
- Sugerido como Resposta Rodrigo CdS segunda-feira, 27 de julho de 2015 16:59
-
-
Seria isso? No caso o interessante seria ter a certeza do relacionamento entre estas tabelas, pelo o que exemplificou, entendi que esse pode ser o resultado.
select * from
histcatrev h inner join
cliente c on (h.codigotipo = c.codigo) inner join
contatos ct on (h.codigo = ct.cliente)
where
... ;
Só para complementar: caso possa ocorrer de o cliente não possuir registro na tabela CONTATO, utilize "LEFT JOIN contatos ct on (...
-
Desculpem pelas duvidas e que os resultados dos meus select não estão batendo como eu gostaria
por isso coloquei os posts para assim poder analisar o que eu estou fazendo de errado.
Eu tenho a tabela PAI que seria a HISTCATREV a qual retorna o numero registros certos de acordo com a
condição abaixo:
SELECT * FROM HISTCATREV
WHERE (H.TIPO = 'R' AND H.REVISTA = '001') OR
(H.TIPO = 'C' AND H.CATEGORIA = 'CON')TOTAL DE REGISTROS: 32.768
--------------------------------------------
Porem eu preciso amarrar essa tabela pai com 2 tabelas filhas CONTATOS e CLIENTES de acordo com os campos codigo do cliente. Eu então fiz um Inner join como foi sugerido porem esta retornando o numero de regostros maior que o esperado o que esta errado.
SELECT * FROM HISTCATREV H INNER JOIN CLIENTES C ON
(H.CODIGOTIPO = C.CODIGO)
INNER JOIN CONTATOS CT ON (H.CODIGOTIPO = CT.CLIENTE)
WHERE (H.TIPO = 'R' AND H.REVISTA = '001') OR
(H.TIPO = 'C' AND H.CATEGORIA = 'CON')TOTAL DE REGISTROS: 47.027
Neste caso esta errado pois o maximo que poderia ter de acordo com a minha primeira condição seria 32.768
Desculpem pelas minhas duvidas mais estou fazendo algo de errado e não estou achando o meu erro.
Quem puder me ajudar eu agradeço muito.
Obrigado
-
-
Tabela: CLIENTES a chave primaria é CODIGO
Tabela: HISTCATREV a chave primaria é CODIGO
Tabela CONTATOS a chave primaria é CODIGO
A relação das tabelas esta no codigo do cliente
na HISTCATREV o campo CODIGOTIPO é o codigo do cliente
na CONTATOS o campo CLIENTE é o codigo do cliente
na CLIENTES o campo CODIGO é o codigo do cliente
Essa é a relação entre as 3 tabelas
Espero que tenham entendido.
Fico no aguardo
Muito Obrigado.
-
-
José Diz
Eu preciso das 3 tabelas e não apenas CLIENTES E HISTCATREV
Pois na tabela CONTATOS eu tenho os e-mails e nome de contatos dos clientes
Então eu preciso de um select com as 3 tabelas.
No codigo 1 que so tem 2 tabelas e qual não posso usar pois preciso dos campos de contatos
32.768 registros
No codigo 2 da o retorno
com repetição - Dif
6755 14822
----------------------------
No codigo 3 da o retorno
N de contatos - N Clientes - Dif
43181 28358 14823
------------------------------
Fico no aguardo
Muito Obrigado
-
Boa noite,
Paulo, pode existir mais de um linha na tabela Contatos para um mesmo cliente?
Se pode, qual linha da tabela Contatos deve ser retornada?
Assinatura: http://www.imoveisemexposicao.com.br
-
-
José Diz
Eu percebi uma outra coisa no codigo
Acho que ai esta o problema
A condição where esta errada
Pois a codição certa seria
Assim if Tipo = 'C' and categoria = 'con'
ou tipo = 'R and revista = '001'
o que faltou e que o campo codigotipo tem que ser igual nas 2 condições
Exempo o cliente A tem que estar nas 2 condições
Eu acredito que seria um select dentro de outro select
Fico no aguardo
Obrigado
-
-
Vou sugerir uma query que talvez ajude na visualização dos dados que estão provocando esse resultado indesejado:
with CTE_Count as ( select *, count(*) over(partition by Cliente) as Qtd from Contatos ) select * from CTE_Count where Qtd > 1 order by Cliente
Espero que seja útil.
Assinatura: http://www.imoveisemexposicao.com.br
-
Bom dia pessoal
Coloquei o order by codigotipo no meu codigo para poder explicar melhor
SELECT * FROM HISTCATREV H INNER JOIN CLIENTES C ON
(H.CODIGOTIPO = C.CODIGO)
INNER JOIN CONTATOS CT ON (H.CODIGOTIPO = CT.CLIENTE)
WHERE (H.TIPO = 'R' AND H.REVISTA = '001') OR
(H.TIPO = 'C' AND H.CATEGORIA = 'CON')
ORDER BY CODIGOTIPOO Resultado dessa query:
387456 C 10 CON NULL SDEPRESS CONSULTORIA
387457 R 10 NULL 001 SDEPRESS CONSULTORIA
405109 R 11 NULL 001 INACE IND. NAUTICA DO CEARA
395721 R 12 NULL 001 BUSCH DO BRASIL LTDA
353131 R 13 NULL 001 AB TERMOFIXOS IND E COM DE POLIMEROS LTDA
353131 R 13 NULL 001 AB TERMOFIXOS IND E COM DE POLIMEROS LTDA
356692 C 14 CON NULL AMPE GASPAR
356693 R 14 NULL 001 AMPE GASPARObserve que os clientes 10 e 14 tem categoria 'CON' e revista '001' este estão corretos. os demais tem apenas umas das condições.
Entenderam agora senhores.
Fico no aguardo.
Muito Obrigado.
-
Bom dia,
Paulo, como você gostaria que ficasse o resultado considerando os dados acima?
Assinatura: http://www.imoveisemexposicao.com.br
-
-
Experimente dessa forma:
with CTE_Count as ( SELECT *, COUNT(*) OVER(PARTITION BY H.CODIGOTIPO) AS Qtd FROM HISTCATREV H INNER JOIN CLIENTES C ON H.CODIGOTIPO = C.CODIGO INNER JOIN CONTATOS CT ON H.CODIGOTIPO = CT.CLIENTE WHERE (H.TIPO = 'R' AND H.REVISTA = '001') OR (H.TIPO = 'C' AND H.CATEGORIA = 'CON') ) SELECT * FROM CTE_Count WHERE Qtd = 2 ORDER BY CODIGOTIPO
Espero que ajude.
Assinatura: http://www.imoveisemexposicao.com.br
-
-
Experimente substituir o * que está após o primeiro Select (dentro da CTE) pelo nome das colunas que você precisa no resultado.
Assinatura: http://www.imoveisemexposicao.com.br
-
Agora não deu erro com as suas mudanças
with CTE_Count as
(
SELECT
H.CODIGOTIPO,H.CATEGORIA,H.REVISTA,H.TIPO,C.RAZAO,CT.EMAIL,
COUNT(*) OVER(PARTITION BY H.CODIGOTIPO) AS Qtd
FROM HISTCATREV H
INNER JOIN CLIENTES C
ON H.CODIGOTIPO = C.CODIGO
INNER JOIN CONTATOS CT
ON H.CODIGOTIPO = CT.CLIENTE
WHERE
(H.TIPO = 'R' AND H.REVISTA = '001') OR
(H.TIPO = 'C' AND H.CATEGORIA = 'CON')
)
SELECT * FROM CTE_Count
WHERE Qtd = 2
ORDER BY CODIGOTIPOPorem não resolveu meu problema
Olha o resultado:
10 CON NULL C SDEPRESS CONSULTORIA
10 NULL 001 R SDEPRESS CONSULTORIA
13 NULL 001 R AB TERMOFIXOS IND E COM DE POLIMEROS LTDA
13 NULL 001 R AB TERMOFIXOS IND E COM DE POLIMEROS LTDA
14 CON NULL C AMPE GASPAR
14 NULL 001 R AMPE GASPAR
19 CON NULL C PROATIVA COMUNICAÇÃO
19 CON NULL C PROATIVA COMUNICAÇÃO
28 NULL 001 R ABARTH EQUI. NAUTICOS TECHNEMA IND E COM LTDA
28 NULL 001 R ABARTH EQUI. NAUTICOS TECHNEMA IND E COM LTDAClientes 10 e 14 apenas atendem as 2 condições
Ainda continua o mesmo problema
Aguardo seu retorno
Obrigado
-
Experimente dessa forma:
with CTE_Count as ( SELECT H.CODIGOTIPO,H.CATEGORIA,H.REVISTA,H.TIPO,C.RAZAO,CT.EMAIL, COUNT(CASE WHEN H.TIPO = 'R' THEN 1 END) OVER(PARTITION BY H.CODIGOTIPO) AS QtdR, COUNT(CASE WHEN H.TIPO = 'C' THEN 1 END) OVER(PARTITION BY H.CODIGOTIPO) AS QtdC FROM HISTCATREV H INNER JOIN CLIENTES C ON H.CODIGOTIPO = C.CODIGO INNER JOIN CONTATOS CT ON H.CODIGOTIPO = CT.CLIENTE WHERE (H.TIPO = 'R' AND H.REVISTA = '001') OR (H.TIPO = 'C' AND H.CATEGORIA = 'CON') ) SELECT * FROM CTE_Count WHERE QtdR > 0 and QtdC > 0 ORDER BY CODIGOTIPO
Espero que ajude.
Assinatura: http://www.imoveisemexposicao.com.br
- Marcado como Resposta ricardoti2012 terça-feira, 28 de julho de 2015 18:03
-
Acho que agora esta quase perfeito.
Pois todos os registros estão na condição da Where
Porem só faltou algo. Os e-mail não podem repetir
2013 NULL 004 R atendimento@canaacoberturas.com.br 2 2
2013 CON NULL C atendimento@canaacoberturas.com.br 2 2
2013 NULL 004 R canaa@amcanaa.com.br 2 2
2013 CON NULL C canaa@amcanaa.com.br 2 2
2814 CON NULL C cinco@cincoengenheiros.com.br 1 1
2814 NULL 004 R cinco@cincoengenheiros.com.br 1 1
3636 NULL 004 R info@plasticosgiosa.com.ar 2 2
3636 CON NULL C info@plasticosgiosa.com.ar 2 2
4272 CON NULL C vendas@dornbusch.com.br 1 1
4272 NULL 004 R vendas@dornbusch.com.br 1 1