none
colocar mais 1 tabela na minha consulta RRS feed

  • 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.

    segunda-feira, 27 de julho de 2015 16:50

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
    terça-feira, 28 de julho de 2015 13:51

Todas as Respostas

  • Uai ela ja está na sua consulta.... 

    select * ---> vai retornar os registros das tabelas HISTCATREV e CLIENTES


    Se a resposta foi útil por favor classifique. Tiago Neves - @tiagolneves - acesse o meu blog http://www.tiagoneves.net

    segunda-feira, 27 de julho de 2015 16:54
  • 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
    segunda-feira, 27 de julho de 2015 16:57
  • Deleted
    segunda-feira, 27 de julho de 2015 17:01
  • 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 (...

    segunda-feira, 27 de julho de 2015 17:01
  • 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

    segunda-feira, 27 de julho de 2015 17:56
  • Deleted
    segunda-feira, 27 de julho de 2015 18:13
  • 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.

    segunda-feira, 27 de julho de 2015 18:19
  • Deleted
    segunda-feira, 27 de julho de 2015 18:42
  • 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

    segunda-feira, 27 de julho de 2015 20:57
  • 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

    segunda-feira, 27 de julho de 2015 21:44
  • Deleted
    segunda-feira, 27 de julho de 2015 22:21
  • 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

    segunda-feira, 27 de julho de 2015 23:33
  • Deleted
    segunda-feira, 27 de julho de 2015 23:39
  • 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

    segunda-feira, 27 de julho de 2015 23:51
  • 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 CODIGOTIPO

    O 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 GASPAR

    Observe 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.

    terça-feira, 28 de julho de 2015 11:42
  • Bom dia,

    Paulo, como você gostaria que ficasse o resultado considerando os dados acima?


    Assinatura: http://www.imoveisemexposicao.com.br

    terça-feira, 28 de julho de 2015 12:42
  • Bom dia 

    De acordo com o resultado acima só apareceriam os clientes que tem as 2 condições

    nesse caso o 10 e 14 pois ambos tem as 2 condições.

    Espero que tenha entendido

    fico no aguardo

    Obrigado.

    terça-feira, 28 de julho de 2015 12:45
  • 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

    terça-feira, 28 de julho de 2015 12:57
  • Não etendi muito bem seu codigo

    Porem eu coloquei e executei e deu erro

    Mensagem 8156, Nível 16, Estado 1, Linha 1
    The column 'CODIGO' was specified multiple times for 'CTE_Count'.

    terça-feira, 28 de julho de 2015 13:08
  • 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

    terça-feira, 28 de julho de 2015 13:13
  • 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 CODIGOTIPO

    Porem 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 LTDA

    Clientes 10 e 14 apenas atendem as 2 condições

    Ainda continua o mesmo problema

    Aguardo seu retorno

    Obrigado

    terça-feira, 28 de julho de 2015 13:33
  • 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
    terça-feira, 28 de julho de 2015 13:51
  • 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

    terça-feira, 28 de julho de 2015 16:30