none
Ajuda com select em tabelas diferentes.... RRS feed

  • Pergunta

  • Olá pessoal! Estou precisando de uma ajuda para criar um select onde eu possa comparar os resultados da seguinte forma:

    Tenho dois selects que me retornam dois resultados diferentes, sendo o primeiro:

    // ESTE SELECT ME RETORNA A SEQUENCIA QUE O TRE DETERMINOU

    SELECT TOP (100) PERCENT COUNT(TRE_INSERCOES.TRE_INSERCOES_ID) AS N, COLIGACOES.COLIGACAO_NOME, COLIGACOES.CIDADE  
    FROM COLIGACOES INNER JOIN TRE_INSERCOES ON COLIGACOES.COLIGACAO_ID = TRE_INSERCOES.COLIGACAO_ID  
    WHERE (TRE_INSERCOES.TRE_INSERCOES_DATA = @DATA) AND (TRE_INSERCOES.TRE_INSERCOES_BLOCO = @BLOCO) 
    AND (COLIGACOES.CIDADE = @CIDADE) AND TRE_INSERCOES_CARGO = @TRE_INSERCOES_CARGO  
    GROUP BY COLIGACOES.COLIGACAO_NOME, COLIGACOES.CIDADE  
    ORDER BY COLIGACOES.COLIGACAO_NOME

    // ESTE SELECT ME RETORNA O QUE REALMENTE VEICULOU E FOI COLETADO PELA EMPRESA

    SELECT TOP (100) PERCENT COUNT(COLETA_ID) AS N, EMISSORA_NOME, COLIGACAO_NOME  
    FROM vColetaDetalhes  
    WHERE (HP = 'False') AND (HS_INICIO >= @DATA_INICIO) AND (HS_INICIO <= @DATA_FINAL) 
    AND (CIDADE = @CIDADE) AND (EMISSORA_NOME = @EMISSORA)  
    GROUP BY EMISSORA_NOME, COLIGACAO_NOME  
    ORDER BY COLIGACAO_NOME

    COMO RESULTADO NO MEU RELATÓRIO FICA DESSA FORMA:

    GOSTARIA DE FAZER NO PRÓPRIO SELECT UMA "COMPARAÇÃO" E USAR APENAS UMA TABELA DESSA FORMA:



    A DIFICULDADE É QUE ESSES DADOS SÃO RESULTADO DE CONTAGENS EM TABELAS DIFERENTES, E QUANDO NÃO EXISTE REGISTRO COLETADO ELE NÃO RETORNA 0...

    COMO POSSO FAZER ISSO DIRETAMENTE NO SELECT?? SE TIVER CONFUSO POSSO DAR MAIS DETALHES...

    DESDE JÁ OBRIGADO!


    • Editado Mario CBA sábado, 25 de agosto de 2012 16:43
    sábado, 25 de agosto de 2012 16:42

Respostas

  • Mario,

    Você deve mudar a construção da CTE, por exemplo:

    ;WITH InsercoesTRE AS
    (
    	SELECT TOP (100) PERCENT COUNT(TRE.TRE_INSERCOES_ID) AS N, 
    					 COL.COLIGACAO_NOME, 
    					 COL.CIDADE  	
    	  FROM COLIGACOES COL 
    	 INNER JOIN TRE_INSERCOES TRE 
    		ON COL.COLIGACAO_ID = TRE.COLIGACAO_ID  
    	 WHERE TRE.TRE_INSERCOES_DATA = @DATA 
    	   AND TRE.TRE_INSERCOES_BLOCO = @BLOCO
    	   AND COL.CIDADE = @CIDADE
    	   AND TRE_INSERCOES_CARGO = @TRE_INSERCOES_CARGO  
    	 GROUP BY COL.COLIGACAO_NOME, 
    			  COL.CIDADE  
    	 ORDER BY COL.COLIGACAO_NOME
    )
    
    
    SELECT TOP (100) PERCENT COUNT(vw.COLETA_ID) AS N, 
    				 TRE.N, 
    				 vw.EMISSORA_NOME, 
    				 vw.COLIGACAO_NOME  
      FROM vColetaDetalhes  vw
     INNER JOIN InsercoesTRE TRE
        ON TRE.Coligacao_Nome = vw.Coligacao_Nome 
       AND TRE.EMISSORA_NOME = vw.EMISSORA_NOME 
     WHERE vw.HP = 'False' 
       AND vw.HS_INICIO >= @DATA_INICIO 
       AND vw.HS_INICIO <= @DATA_FINAL
       AND vw.CIDADE = @CIDADE 
       AND vw.EMISSORA_NOME = @EMISSORA
     GROUP BY vw.EMISSORA_NOME, 
    		  vw.COLIGACAO_NOME  
     ORDER BY vw.COLIGACAO_NOME

    Tenta rodar a query no sql antes de utilizá-la na aplicação, fica mais fácil de descobrir os erros e corrigi-los, se for o caso.


    []'s
    Philipe Souza
    E-mail: Philipe.s.souza@hotmail.com

    • Marcado como Resposta Mario CBA quarta-feira, 29 de agosto de 2012 13:07
    terça-feira, 28 de agosto de 2012 21:15

Todas as Respostas

  • Olá Mario,

    Pelo que entendi, você usaria os campos EMISSORA_NOME e COLIGACAO_NOME para relacionar as duas consultas, não é?

    Então, acredito que o exemplo a seguir pode te ajudar.

    ;WITH InsercoesTRE AS
    (
    	SELECT TOP (100) PERCENT COUNT(TRE_INSERCOES.TRE_INSERCOES_ID) AS N, 
    					 COL.COLIGACAO_NOME, 
    					 COL.CIDADE  	
    	  FROM COLIGACOES COL 
    	 INNER JOIN TRE_INSERCOES TRE 
    		ON COL.COLIGACAO_ID = TRE.COLIGACAO_ID  
    	 WHERE TRE.TRE_INSERCOES_DATA = @DATA 
    	   AND TRE.TRE_INSERCOES_BLOCO = @BLOCO
    	   AND COL.CIDADE = @CIDADE
    	   AND TRE_INSERCOES_CARGO = @TRE_INSERCOES_CARGO  
    	 GROUP BY COL.COLIGACAO_NOME, 
    			  COL.CIDADE  
    	 ORDER BY COL.COLIGACAO_NOME
    )
    
    
    SELECT TOP (100) PERCENT COUNT(vw.COLETA_ID) AS N, 
    				 TRE.N, 
    				 vw.EMISSORA_NOME, 
    				 vw.COLIGACAO_NOME  
      FROM vColetaDetalhes  vw
     INNER JOIN InsercoesTRE TRE
        ON TRE.Coligacao_Nome = vw.Coligacao_Nome 
       AND TRE.EMISSORA_NOME = vw.EMISSORA_NOME 
     WHERE vw.HP = 'False' 
       AND vw.HS_INICIO >= @DATA_INICIO 
       AND vw.HS_INICIO <= @DATA_FINAL
       AND vw.CIDADE = @CIDADE 
       AND vw.EMISSORA_NOME = @EMISSORA
     GROUP BY vw.EMISSORA_NOME, 
    		  vw.COLIGACAO_NOME  
     ORDER BY vw.COLIGACAO_NOME


    []'s
    Philipe Souza
    E-mail: Philipe.s.souza@hotmail.com

    • Marcado como Resposta Harley Araujo segunda-feira, 27 de agosto de 2012 15:12
    • Não Marcado como Resposta Mario CBA terça-feira, 28 de agosto de 2012 21:02
    sábado, 25 de agosto de 2012 19:19
  • Olá Philipe. 

    Acredito que esse realmente seja o caminho, mas quando executo esse select tenho o seguinte erro:

    Obs: USO apenas o campo COLIGACAO_NOME para vincular... O campo emissora so temos na COLETA....

    Fiz vários testes mas não consigo encontrar a solução. Por favor me ajude pois não sou expert em SQL

    Obrigado pela ajuda!

    terça-feira, 28 de agosto de 2012 21:02
  • Mario,

    Você deve mudar a construção da CTE, por exemplo:

    ;WITH InsercoesTRE AS
    (
    	SELECT TOP (100) PERCENT COUNT(TRE.TRE_INSERCOES_ID) AS N, 
    					 COL.COLIGACAO_NOME, 
    					 COL.CIDADE  	
    	  FROM COLIGACOES COL 
    	 INNER JOIN TRE_INSERCOES TRE 
    		ON COL.COLIGACAO_ID = TRE.COLIGACAO_ID  
    	 WHERE TRE.TRE_INSERCOES_DATA = @DATA 
    	   AND TRE.TRE_INSERCOES_BLOCO = @BLOCO
    	   AND COL.CIDADE = @CIDADE
    	   AND TRE_INSERCOES_CARGO = @TRE_INSERCOES_CARGO  
    	 GROUP BY COL.COLIGACAO_NOME, 
    			  COL.CIDADE  
    	 ORDER BY COL.COLIGACAO_NOME
    )
    
    
    SELECT TOP (100) PERCENT COUNT(vw.COLETA_ID) AS N, 
    				 TRE.N, 
    				 vw.EMISSORA_NOME, 
    				 vw.COLIGACAO_NOME  
      FROM vColetaDetalhes  vw
     INNER JOIN InsercoesTRE TRE
        ON TRE.Coligacao_Nome = vw.Coligacao_Nome 
       AND TRE.EMISSORA_NOME = vw.EMISSORA_NOME 
     WHERE vw.HP = 'False' 
       AND vw.HS_INICIO >= @DATA_INICIO 
       AND vw.HS_INICIO <= @DATA_FINAL
       AND vw.CIDADE = @CIDADE 
       AND vw.EMISSORA_NOME = @EMISSORA
     GROUP BY vw.EMISSORA_NOME, 
    		  vw.COLIGACAO_NOME  
     ORDER BY vw.COLIGACAO_NOME

    Tenta rodar a query no sql antes de utilizá-la na aplicação, fica mais fácil de descobrir os erros e corrigi-los, se for o caso.


    []'s
    Philipe Souza
    E-mail: Philipe.s.souza@hotmail.com

    • Marcado como Resposta Mario CBA quarta-feira, 29 de agosto de 2012 13:07
    terça-feira, 28 de agosto de 2012 21:15
  • Agora funcionou!!! Muito obrigado Philipe, não teria chego nesse resultado sem sua ajuda... agora o relatório vai ficar show!

    Fiz apenas duas correções e funcionou segue modelo que esta rodando perfeitamente:

    WITH InsercoesTRE AS (SELECT        TOP (100) PERCENT COUNT(TRE.TRE_INSERCOES_ID) AS N, COL.COLIGACAO_NOME, COL.CIDADE
                                                         FROM            COLIGACOES AS COL INNER JOIN
                                                                                  TRE_INSERCOES AS TRE ON COL.COLIGACAO_ID = TRE.COLIGACAO_ID
                                                         WHERE        (TRE.TRE_INSERCOES_DATA = @DATA) AND (TRE.TRE_INSERCOES_BLOCO = @BLOCO) AND (COL.CIDADE = @CIDADE) AND 
                                                                                  (TRE.TRE_INSERCOES_CARGO = @TRE_INSERCOES_CARGO)
                                                         GROUP BY COL.COLIGACAO_NOME, COL.CIDADE
                                                         ORDER BY COL.COLIGACAO_NOME)
        SELECT        TOP (100) PERCENT vw.COLIGACAO_NOME, vw.EMISSORA_NOME, TRE.N AS TRE, COUNT(vw.COLETA_ID) AS AFPL
         FROM            vColetaDetalhes AS vw INNER JOIN
                                  InsercoesTRE AS TRE ON TRE.COLIGACAO_NOME = vw.COLIGACAO_NOME
         WHERE        (vw.HP = 'False') AND (vw.HS_INICIO >= @DATA_INICIO) AND (vw.HS_INICIO <= @DATA_FINAL) AND (vw.CIDADE = @CIDADE) AND 
                                  (vw.EMISSORA_NOME = @EMISSORA)
         GROUP BY vw.COLIGACAO_NOME, TRE.N, vw.EMISSORA_NOME
         ORDER BY vw.COLIGACAO_NOME
    

    VLW!!!

    quarta-feira, 29 de agosto de 2012 13:11