Inquiridor
Dúvida consulta com Union SQL.

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
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?
- Sugerido como Resposta Junior Galvão - MVPMVP terça-feira, 2 de fevereiro de 2016 13:48
-
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]
-