none
Dúvida consulta com Union SQL. RRS feed

  • Pergunta

  • Olá pessoal,

    A query abaixo me retorna uma planilha que contem 39 períodos e a soma dos valores numa coluna chamada apropriado, quando uso o union nas 3 consultas  ele remove alguns valores e o valor da coluna apropriado retorna a menos do calculo da planilha, por exemplo o valor é para dar 25.500 e vem 24.700. Se eu usar o union all ele me trás um valor muito a mais do que eu quero. 

    A primeira consulta retorna o valor da coluna apropriado de outro modulo do sistema (compra e vendas), a segunda consulta retorna os 39 períodos e a terceira consulta retorna o valor da coluna apropriado do modulo atual (modulo de projetos) não exista no modulo da primeira consulta.

    Gostaria da ajuda de alguém para analisar aonde estou errando, se é na hora de utilizar função de agregação ou na hora de agrupar, se tem outra forma de fazer sem o union (all). 

    Agradeço a ajuda desde já.

    SELECT 
    COLIGADA,
    PROJETO, 
    MES_EMISSAO, 
    ANO_EMISSAO, 
    CODIGO_TAREFA, 
    NOME_TAREFA, 
    SUM(PLANEJADO) 'PLANEJADO', 
    SUM(REALIZADO) 'REALIZADO', 
    SUM(MEDIDO) 'MEDIDO',
    SUM(APROPRIADO) 'APROPRIADO'
    FROM
    (
    
    (
    SELECT 
    G.NOMEFANTASIA COLIGADA,
    P.DESCRICAO 'PROJETO', 
    MONTH(M.DATAEMISSAO) 'MES_EMISSAO', 
    YEAR(M.DATAEMISSAO) 'ANO_EMISSAO' ,
    T.CODTRF 'CODIGO_TAREFA', 
    T.NOME 'NOME_TAREFA', 
    0 'PLANEJADO', 
    0 'REALIZADO',
    0 'MEDIDO', 
    R.VALOR 'APROPRIADO'
    FROM TITMMOVRATCCU R
    
    LEFT JOIN TMOV M
    ON (M.IDMOV=R.IDMOV
    AND M.CODCOLIGADA=R.CODCOLIGADA)
    
    LEFT JOIN MPRJ P
    ON (P.IDPRJ=R.IDPRJ
    AND P.CODCOLIGADA=R.CODCOLIGADA)
    
    LEFT JOIN MTAREFA T
    ON (R.IDTRF=T.IDTRF
    AND R.CODCOLIGADA=T.CODCOLIGADA)
    
    INNER JOIN GCOLIGADA G
    ON (P.CODCOLIGADA = G.CODCOLIGADA)
    
    WHERE 
    R.IDPRJ IS NOT NULL 
    AND R.VALOR IS NOT NULL
    AND R.VALOR > 0
    AND P.POSICAO = 4
    AND T.CODTRF =	'01.08.09'
    AND P.CODCOLIGADA= 3
    AND M.CODTMV in ('1.1.50','2.2.10')
    
    UNION
    
    SELECT 
    G.NOMEFANTASIA COLIGADA,
    P.DESCRICAO 'PROJETO', 
    MONTH(C.DTINICIO) 'MES_EMISSAO',
    YEAR(C.DTINICIO) 'ANO_EMISSAO', 
    C.CODTRF 'CODIGO_TAREFA', 
    C.NOME 'NOME_TAREFA', 
    ISNULL(C.VALORPLANEJADO,0) 'PLANEJADO',
    ISNULL(C.VALORREAL,0) 'REALIZADO', 
    ISNULL(C.VALORMEDIDO,0) 'MEDIDO', 
    0 'APROPRIADO' 
    
    FROM MXMTRFCRONOG C
    LEFT JOIN MISMAPROP B
    on( B.CODCOLIGADA = C.CODCOLIGADA
    AND B.IDPRJ = C.IDPRJ	
    AND B.IDTRF = C.IDTRF)	
    
    INNER JOIN MPRJ P
    ON (C.CODCOLIGADA=P.CODCOLIGADA
    AND C.IDPRJ=P.IDPRJ)
    
    INNER JOIN GCOLIGADA G
    ON (P.CODCOLIGADA = G.CODCOLIGADA)
    WHERE 
    C.CODTRF = '01.08.09'
    AND P.POSICAO = 4
    AND P.CODCOLIGADA= 3
    )
    
    UNION ALL
    
    SELECT 
    G.NOMEFANTASIA COLIGADA,
    P.DESCRICAO 'PROJETO', 
    MONTH(C.DTINICIO) 'MES_EMISSAO',
    YEAR(C.DTINICIO) 'ANO_EMISSAO',  
    C.CODTRF 'CODIGO_TAREFA', 
    C.NOME 'NOME_TAREFA', 
    ISNULL(C.VALORPLANEJADO,0) 'PLANEJADO',
    ISNULL(C.VALORREAL,0) 'REALIZADO', 
    ISNULL(C.VALORMEDIDO,0) 'MEDIDO', 
    (B.QUANTIDADE*B.PRECOUNITARIO) 'APROPRIADO' 
    
    FROM MXMTRFCRONOG C
    
    LEFT JOIN MISMAPROP B
    on( B.CODCOLIGADA = C.CODCOLIGADA 
    AND B.IDPRJ = C.IDPRJ	
    AND B.IDTRF = C.IDTRF)	
    
    INNER JOIN MPRJ P
    ON (C.CODCOLIGADA=P.CODCOLIGADA 
    AND C.IDPRJ=P.IDPRJ)
    
    INNER JOIN GCOLIGADA G
    ON (P.CODCOLIGADA = G.CODCOLIGADA)
    WHERE 
    
    C.CODTRF = '01.08.09'
    AND P.POSICAO = 4
    AND P.CODCOLIGADA= 3
    AND B.DATAAPROPRIACAO BETWEEN C.DTINICIO AND C.DTFIM
    )X
    
    GROUP BY PROJETO,MES_EMISSAO, ANO_EMISSAO, COLIGADA,  CODIGO_TAREFA, NOME_TAREFA
    
    ORDER BY ANO_EMISSAO

    quinta-feira, 14 de janeiro de 2016 14:51

Todas as Respostas

  • Cara,

    o numero absurdo surge porque, você vem somando o APROPRIADO. Por exemplo, na primra tabela o valor do apropriado 100 da segunda 200 e da terceira 300, se você fizesse o union all sem group by em baixo, o resultado seria:

    100 - Apropriado tab1

    200 - Apropriado tab2

    300 - Apropriado tab3

    com o group by seu resultado será

    600 - Apropriado

    entendeu?

    segunda-feira, 18 de janeiro de 2016 18:55
  • Cara,

    o numero absurdo surge porque, você vem somando o APROPRIADO. Por exemplo, na primra tabela o valor do apropriado 100 da segunda 200 e da terceira 300, se você fizesse o union all sem group by em baixo, o resultado seria:

    100 - Apropriado tab1

    200 - Apropriado tab2

    300 - Apropriado tab3

    com o group by seu resultado será

    600 - Apropriado

    entendeu?

    Luiz,

    Concordo com a sugestão do Renato, remova o union all, assim o SQL Server não vai retornar linhas com valores nulos ou que possam representar valores duplicados.


    Pedro Antonio Galvao Junior [MVP | MCC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    terça-feira, 19 de janeiro de 2016 13:51
  • Luiz

    Lembre de marcar como resposta se o problema foi solucionado!

    quinta-feira, 4 de fevereiro de 2016 05:22