none
Union com problema RRS feed

  • Pergunta

  • Prezados boa tarde preciso fazer um union com varias informaçoes, estou começando porem nao sei por que motivo em determinado momento nao esta agrupando.

    vejam

    SELECT
    N.[CODIGO] AS 'CODIGO',
    N.[NOME]   AS 'NOME',
    N.[UND]  AS 'UND',
    N.[QTD]  AS 'QTD',
    N.[UNIT] AS 'UNIT',
    N.[TOTAL] AS 'TOTAL',
    N.[PREVISTO] AS 'PREVISTO'
    FROM
    (

    SELECT
           MT.CODTRF      AS 'CODIGO', 
           MT.NOME        AS 'NOME',
           MT.CODUND      AS 'UND',
           MT.QUANTIDADE  AS 'QTD',
           MT.VALORUNIT   AS 'UNIT',
           MT.VALORTOTAL  AS 'TOTAL',
           '0' AS 'QTD PREVISTO'

     FROM MTRF AS MT (NOLOCK)
      INNER JOIN MPRJ    AS  MP (NOLOCK)  ON   MP.CODCOLIGADA = MT.CODCOLIGADA AND MP.IDPRJ = MT.IDPRJ
    WHERE
    MT.INDIRETO <> '1'
    AND MP.CODPRJ = '02.0041'
    AND MT.ATIVA = '1'

    UNION ALL
    SELECT
    '0'  AS 'CODIGO',
    '0'  AS 'NOME',
    '0'  AS 'UND',
    '0'  AS 'QTD',
    '0'  AS 'UNT',
    '0'  AS 'TOTAL',
    sum (M.QUANTPLANEJADO) AS 'PREVISTO'

           FROM MXMTRFCRONOG  AS M(NOLOCK)
           INNER JOIN MTRF AS T (NOLOCK) ON T.CODCOLIGADA = M.CODCOLIGADA AND T.IDPRJ = M.IDPRJ AND T.IDTRF = M.IDTRF
          
           WHERE M.IDPRJ = '389' --AND IDTRF = '131'
           AND M.DTINICIO >= '2012-04-21'  AND M.DTINICIO <= '2012-05-11'
           AND T.ATIVA = '1'
           AND T.INDIRETO <> '1'
           GROUP BY M.IDTRF
       )
       N(CODIGO,NOME,UND,QTD,UNIT,TOTAL,PREVISTO)
       GROUP BY CODIGO,NOME,UND,QTD,UNIT,TOTAL,PREVISTO

    Dessa forma ele me retorna esse resultado

    Codigo    Nome      UNd               Qtd           Unt             Total           Previsto

    0             0            0                   0.0000      0.0000         0.0000       NULL
    0             0            0                   0.0000      0.0000         0.0000       0.0154
    0             0            0                   0.0000      0.0000         0.0000       0.6552
    001       RECUP      NULL             1.0000      487632         487632       0

    001.01   SERVIÇ  L NULL            1               2795616       2795616      0

    Resultado esperado

    Codigo    Nome      UNd               Qtd           Unt             Total           Previsto

    001       RECUP      NULL             1.0000      487632         487632       0.0154

    001.01   SERVIÇ  L NULL            1               2795616       2795616      0.6552

    a ideia seria esse resultado esperado.

    quarta-feira, 23 de maio de 2012 18:41

Respostas

  • Ronnie,

    Acredito que você está utilizando seu SELECT de forma errada, pois no seu select você defina de forma fixa pra Código e Nome, logo o problema não é no UNION. Veja se o exemplo resolve seu problema.

    SELECT 
    N.[CODIGO] AS 'CODIGO',
     N.[NOME]   AS 'NOME'
     
    FROM 
    (
     
    
    SELECT 
           MT.CODTRF      AS 'CODIGO',  
           MT.NOME        AS 'NOME'
     
     FROM MTRF AS MT (NOLOCK)
       INNER JOIN MPRJ         AS MP (NOLOCK)  ON   MP.CODCOLIGADA = MT.CODCOLIGADA AND MP.IDPRJ = MT.IDPRJ
     
    WHERE 
    MT.INDIRETO <> '1'
     AND MP.CODPRJ = '02.0041'
     AND MT.ATIVA = '1'
     AND MT.IDPRJ = '389'
     
    
    UNION ALL
     SELECT 
    T.CODTRF  AS 'CODIGO',
    T.NOME   AS 'NOME'
     
           FROM MXMTRFCRONOG  AS M(NOLOCK)
            INNER JOIN MTRF AS T (NOLOCK) ON T.CODCOLIGADA = M.CODCOLIGADA AND T.IDPRJ = M.IDPRJ AND T.IDTRF = M.IDTRF
            
           WHERE M.IDPRJ = '389' --AND --t.IDTRF = '131'
            AND M.DTINICIO >= '2012-04-21'  AND M.DTINICIO <= '2012-05-11'
            AND T.ATIVA = '1'
            AND T.INDIRETO <> '1'
            GROUP BY T.CODTRF
      
        )
        N(CODIGO,NOME)
       GROUP BY CODIGO,NOME
       order by n.codigo
    


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

    • Sugerido como Resposta Philipe Souza sexta-feira, 25 de maio de 2012 23:01
    • Marcado como Resposta Ronnie Von terça-feira, 29 de maio de 2012 12:39
    quinta-feira, 24 de maio de 2012 20:33

Todas as Respostas

  • Prezados tentando melhorar a SQl veja como esta ficando:

    SELECT
    N.[CODIGO] AS 'CODIGO',
    N.[NOME]   AS 'NOME'

    FROM
    (

    SELECT
           '0'     AS 'CODIGO', 
           MT.NOME        AS 'NOME'

     FROM MTRF AS MT (NOLOCK)
      INNER JOIN MPRJ         AS MP (NOLOCK)  ON   MP.CODCOLIGADA = MT.CODCOLIGADA AND MP.IDPRJ = MT.IDPRJ

    WHERE
    MT.INDIRETO <> '1'
    AND MP.CODPRJ = '02.0041'
    AND MT.ATIVA = '1'
    AND MT.IDPRJ = '389'


    UNION ALL
    SELECT
    T.CODTRF  AS 'CODIGO',
    '0'  AS 'NOME'

           FROM MXMTRFCRONOG  AS M(NOLOCK)
           INNER JOIN MTRF AS T (NOLOCK) ON T.CODCOLIGADA = M.CODCOLIGADA AND T.IDPRJ = M.IDPRJ AND T.IDTRF = M.IDTRF
          
           WHERE M.IDPRJ = '389' --AND --t.IDTRF = '131'
           AND M.DTINICIO >= '2012-04-21'  AND M.DTINICIO <= '2012-05-11'
           AND T.ATIVA = '1'
           AND T.INDIRETO <> '1'
           GROUP BY T.CODTRF
     
       )
       N(CODIGO,NOME)
      GROUP BY CODIGO,NOME
      order by n.codigo

    Resultado

    Codigo                 Nome

    0                         ADMINISTRAÇÃO DA OBRA
    0                         Aquisição, carga, transporte e descarga das pedras
    0                         Batimetrias por demanda
    0                         Canteiro de Obras
    0                          Controle Topográfico
    001                        0
    001.01                  0    
    001.01.001           0         
    001.01.002           0
    001.01.003            0

    Resultado esperado, juntar tudo

    Codigo                  Nome

    001                          ADMINISTRAÇÃO DA OBRA
    001.01                     Aquisição, carga, transporte e descarga das pedras
    001.01.001               Batimetrias por demanda
    001.01.002                Canteiro de Obras
    001.01.003                Controle Topográfico

    isso ja me ajudaria muito, obrigado

    quarta-feira, 23 de maio de 2012 20:23
  • Ronnie,

    Acredito que você está utilizando seu SELECT de forma errada, pois no seu select você defina de forma fixa pra Código e Nome, logo o problema não é no UNION. Veja se o exemplo resolve seu problema.

    SELECT 
    N.[CODIGO] AS 'CODIGO',
     N.[NOME]   AS 'NOME'
     
    FROM 
    (
     
    
    SELECT 
           MT.CODTRF      AS 'CODIGO',  
           MT.NOME        AS 'NOME'
     
     FROM MTRF AS MT (NOLOCK)
       INNER JOIN MPRJ         AS MP (NOLOCK)  ON   MP.CODCOLIGADA = MT.CODCOLIGADA AND MP.IDPRJ = MT.IDPRJ
     
    WHERE 
    MT.INDIRETO <> '1'
     AND MP.CODPRJ = '02.0041'
     AND MT.ATIVA = '1'
     AND MT.IDPRJ = '389'
     
    
    UNION ALL
     SELECT 
    T.CODTRF  AS 'CODIGO',
    T.NOME   AS 'NOME'
     
           FROM MXMTRFCRONOG  AS M(NOLOCK)
            INNER JOIN MTRF AS T (NOLOCK) ON T.CODCOLIGADA = M.CODCOLIGADA AND T.IDPRJ = M.IDPRJ AND T.IDTRF = M.IDTRF
            
           WHERE M.IDPRJ = '389' --AND --t.IDTRF = '131'
            AND M.DTINICIO >= '2012-04-21'  AND M.DTINICIO <= '2012-05-11'
            AND T.ATIVA = '1'
            AND T.INDIRETO <> '1'
            GROUP BY T.CODTRF
      
        )
        N(CODIGO,NOME)
       GROUP BY CODIGO,NOME
       order by n.codigo
    


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

    • Sugerido como Resposta Philipe Souza sexta-feira, 25 de maio de 2012 23:01
    • Marcado como Resposta Ronnie Von terça-feira, 29 de maio de 2012 12:39
    quinta-feira, 24 de maio de 2012 20:33
  • Obrigado Philipe.
    terça-feira, 29 de maio de 2012 12:40