none
Consultar com tres tabelas vindo todos os dados RRS feed

  • Pergunta

  • Pessoal estou precisando fazer uma consulta a tres tabelas com soma de campo horas de duas delas e a terceira que server pra mostra quem nao fez nada

    segue a consulta que esta com erro pois esta repetindo os dados

    SELECT   distinct CIDADE, NOME, PROFISSAO, email,
    		   RIGHT('0' + CONVERT(VARCHAR, MINUTOS / 60), 2) + ':' + RIGHT('0' + CONVERT(VARCHAR, MINUTOS % 60), 2)+':00'  AS TH,
    		   RIGHT('0' + CONVERT(VARCHAR, MINUTOSAPV / 60), 2) + ':' + RIGHT('0' + CONVERT(VARCHAR, MINUTOSAPV % 60), 2)+':00'  AS THV
    		   
    FROM (
    
    
    SELECT     AP.ID as id, MAT.Nome AS NOME, AP.PROFISSAO ,mat.email, SUM(SUBSTRING(AP.TH, 1, 2) * 60 + SUBSTRING(AP.TH, 4, 2)) AS MINUTOS,
    						 '0' AS MINUTOSAPV, AP.CIDADE
                           FROM          [Aprora WEB].dbo.Apropriacao AS AP INNER JOIN
                                         [Server Information 2004].dbo.Matricula AS MAT ON AP.ID = MAT.ID --or ap.id <> mat.id									 
    					   WHERE AP.DATA BETWEEN '2013-03-01' AND '2013-03-11' 
                           GROUP BY AP.ID, MAT.Nome, AP.PROFISSAO, AP.CIDADE, mat.email
    
    UNION
    
    SELECT     APV.ID, MAT.Nome AS NOME, APV.PROFISSAO ,mat.email, '0' AS MINUTOS, SUM(SUBSTRING(APV.TH, 1, 2) * 60 + SUBSTRING(APV.TH, 4, 2)) AS MINUTOSAPV, APV.CIDADE
                           FROM          [Aprora WEB].dbo.Apropriacao_Validacao AS APV INNER JOIN
                                         [Server Information 2004].dbo.Matricula AS MAT ON APV.ID = MAT.ID --or apv.id <> mat.id			
    					   WHERE APV.DATA BETWEEN '2013-03-01' AND '2013-03-11' 
                           GROUP BY APV.ID, MAT.Nome, APV.PROFISSAO, APV.CIDADE, mat.email
    
    UNION 
    
    
    SELECT    ID, NOME, PROFISSAO, EMAIL, '0' AS MINUTOS, '0' AS MINUTOSAPV, CIDADE
    						FROM [Server Information 2004].dbo.Matricula 
    						WHERE VIGENCIA = '1'
    						GROUP BY ID, NOME, PROFISSAO, EMAIL, CIDADE) AS X
    
    GROUP BY  CIDADE, NOME, PROFISSAO,email,  RIGHT('0' + CONVERT(VARCHAR, MINUTOS / 60), 2) + ':' + RIGHT('0' + CONVERT(VARCHAR, MINUTOS % 60), 2),
    		 RIGHT('0' + CONVERT(VARCHAR, MINUTOSAPV / 60), 2) + ':' + RIGHT('0' + CONVERT(VARCHAR, MINUTOSAPV % 60), 2)
    ORDER BY NOME, CIDADE



    • Editado louco82 quarta-feira, 13 de março de 2013 18:43
    quarta-feira, 13 de março de 2013 18:39

Respostas

  • Boa tarde,

    Experimente dessa forma:

    with
        CTE_AP as
        (
            SELECT 
                AP.ID, 
                SUM(SUBSTRING(AP.TH, 1, 2) * 60 + SUBSTRING(AP.TH, 4, 2)) AS MINUTOS
            FROM [Aprora WEB].dbo.Apropriacao AS AP 								 
            WHERE AP.DATA BETWEEN '2013-03-01' AND '2013-03-11' 
            GROUP BY AP.ID
        ),
    
        CTE_APV as
        ( 
            SELECT
                APV.ID, 
                SUM(SUBSTRING(APV.TH, 1, 2) * 60 + SUBSTRING(APV.TH, 4, 2)) AS MINUTOSAPV
            FROM [Aprora WEB].dbo.Apropriacao_Validacao AS APV 		
            WHERE APV.DATA BETWEEN '2013-03-01' AND '2013-03-11' 
            GROUP BY APV.ID
        )
    
    SELECT 
        MAT.CIDADE, 
        MAT.Nome, 
        MAT.PROFISSAO, 
        MAT.email,
        RIGHT('0' + CONVERT(VARCHAR, AP.MINUTOS / 60), 2) + ':' + 
        RIGHT('0' + CONVERT(VARCHAR, AP.MINUTOS % 60), 2) + ':00' AS TH,
        RIGHT('0' + CONVERT(VARCHAR, APV.MINUTOSAPV / 60), 2) + ':' + 
        RIGHT('0' + CONVERT(VARCHAR, APV.MINUTOSAPV % 60), 2) + ':00' AS THV
    FROM [Server Information 2004].dbo.Matricula AS MAT
    INNER JOIN CTE_AP AS AP
        ON AP.ID = MAT.ID
    INNER JOIN CTE_APV AS APV
        ON APV.ID = MAT.ID
    WHERE MAT.VIGENCIA = '1'
    ORDER BY MAT.NOME, MAT.CIDADE


    Espero que ajude.


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


    • Editado gapimex quarta-feira, 13 de março de 2013 20:07
    • Marcado como Resposta Felipo Gonçalves quarta-feira, 13 de março de 2013 20:33
    quarta-feira, 13 de março de 2013 20:05

Todas as Respostas

  • Louco82,

    Você poderia apresentar o resultado que esta sendo retornado?


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    quarta-feira, 13 de março de 2013 19:03
  • Salvador ABEL FERREIRA SAMPAIO TEC. SEG. DO TRABALHO 00:00:00 00:00:00
    Recife ADALBERTO LOPES DE ANDRADE ASSISTENTE ADMINISTRATIVO 00:00:00 00:00:00
    Recife ADEMARIO LUIZ DA PACIENCIA Cadista 00:00:00 00:00:00
    Recife ADILSON CAVALCANTI CABRAL Engenheiro(a) Civil 00:00:00 00:00:00
    Recife ADILSON CAVALCANTI CABRAL Engenheiro(a) Civil 17:00:00 00:00:00
    Recife ADRIANA CARDOSO DOS SANTOS Engenheiro(a) Civil 00:00:00 00:00:00
    Recife ADRIANA CARDOSO DOS SANTOS Engenheiro(a) Civil 00:00:00 61:00:00

    a saida com replica dos valores

    pior q ate com o distinct em cada sub consulta ele ainda repete 

    quarta-feira, 13 de março de 2013 19:11
  • Boa tarde,

    Experimente dessa forma:

    with
        CTE_AP as
        (
            SELECT 
                AP.ID, 
                SUM(SUBSTRING(AP.TH, 1, 2) * 60 + SUBSTRING(AP.TH, 4, 2)) AS MINUTOS
            FROM [Aprora WEB].dbo.Apropriacao AS AP 								 
            WHERE AP.DATA BETWEEN '2013-03-01' AND '2013-03-11' 
            GROUP BY AP.ID
        ),
    
        CTE_APV as
        ( 
            SELECT
                APV.ID, 
                SUM(SUBSTRING(APV.TH, 1, 2) * 60 + SUBSTRING(APV.TH, 4, 2)) AS MINUTOSAPV
            FROM [Aprora WEB].dbo.Apropriacao_Validacao AS APV 		
            WHERE APV.DATA BETWEEN '2013-03-01' AND '2013-03-11' 
            GROUP BY APV.ID
        )
    
    SELECT 
        MAT.CIDADE, 
        MAT.Nome, 
        MAT.PROFISSAO, 
        MAT.email,
        RIGHT('0' + CONVERT(VARCHAR, AP.MINUTOS / 60), 2) + ':' + 
        RIGHT('0' + CONVERT(VARCHAR, AP.MINUTOS % 60), 2) + ':00' AS TH,
        RIGHT('0' + CONVERT(VARCHAR, APV.MINUTOSAPV / 60), 2) + ':' + 
        RIGHT('0' + CONVERT(VARCHAR, APV.MINUTOSAPV % 60), 2) + ':00' AS THV
    FROM [Server Information 2004].dbo.Matricula AS MAT
    INNER JOIN CTE_AP AS AP
        ON AP.ID = MAT.ID
    INNER JOIN CTE_APV AS APV
        ON APV.ID = MAT.ID
    WHERE MAT.VIGENCIA = '1'
    ORDER BY MAT.NOME, MAT.CIDADE


    Espero que ajude.


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


    • Editado gapimex quarta-feira, 13 de março de 2013 20:07
    • Marcado como Resposta Felipo Gonçalves quarta-feira, 13 de março de 2013 20:33
    quarta-feira, 13 de março de 2013 20:05
  • Só que preciso listar tb, quem esta na tabela matricula com horas zeradas que nao esta na tabela apropriacao,  no periodo listado
    • Marcado como Resposta louco82 quarta-feira, 13 de março de 2013 20:26
    • Não Marcado como Resposta louco82 quarta-feira, 13 de março de 2013 20:26
    quarta-feira, 13 de março de 2013 20:21
  • Só que preciso listar tb, quem esta na tabela matricula com horas zeradas que nao esta na tabela apropriacao,  no periodo listado

    CARO AMIGO gapimex, PENSEI SABER DE BANCO DE DADOS,

    MAS DEPOIS DE SUA CONSULTA VOU ESTUDAR MAIS E MAIS 

    quarta-feira, 13 de março de 2013 20:28
  • Tente alterar os Inner Joins por Left Joins:

    -- ...
    LEFT JOIN CTE_AP AS AP
        ON AP.ID = MAT.ID
    LEFT JOIN CTE_APV AS APV
        ON APV.ID = MAT.ID
    -- ...

    Espero que ajude.


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

    quarta-feira, 13 de março de 2013 20:55
  • OK, usei o full outer join 

    dai saiu como a gerencia precisava 

    Valeu mesmo cara

    • Marcado como Resposta louco82 quarta-feira, 13 de março de 2013 21:28
    • Não Marcado como Resposta louco82 quarta-feira, 13 de março de 2013 21:28
    quarta-feira, 13 de março de 2013 21:24