none
Unir varias SQL RRS feed

  • Pergunta

  • Amigos Boa Tarde!

    Preciso unir varias SQL, porem o resulto individual de casa uma me retorna o que de fato eu preciso, porem no momento de uniar a coluna que deveria somar SOMA todo resultado e não por SECAO.

    Vejam como estou fazendo.

    1 SQL 

    SELECT 
    CODCOLIGADA, 
    ANO, 
    MES, 
    CODIGO, 
    DESCRICAO, 
    SUM(ADM) ADMITIDOS, 
    SUM(DEM) DEMITIDOS,
    ( SELECT  COUNT(A.CHAPA)
    FROM PFUNC A
    LEFT JOIN PFRATEIOFIXO B ON A.CODCOLIGADA = B.CODCOLIGADA AND A.CHAPA = B.CHAPA
    WHERE A.CODCOLIGADA = TURNOVER.CODCOLIGADA 
    AND A.DATAADMISSAO < CONVERT(DATETIME,TURNOVER.ANO+'-'+TURNOVER.MES+'-'+'01')
    AND (A.CODSITUACAO <> 'D' OR ( A.CODSITUACAO = 'D' AND A.DATADEMISSAO > 
    CONVERT(DATETIME,TURNOVER.ANO+'-'+TURNOVER.MES+'-'+'01')))
                AND A.CODCOLIGADA = TURNOVER.CODCOLIGADA
    AND A.CODSECAO = TURNOVER.CODIGO
    ) AS FUNC_INICIO_MES,

    ( SELECT  COUNT(A.CHAPA)
    FROM PFUNC A
    LEFT JOIN PFRATEIOFIXO B ON A.CODCOLIGADA = B.CODCOLIGADA AND A.CHAPA = B.CHAPA
    WHERE A.CODCOLIGADA = TURNOVER.CODCOLIGADA 
    AND A.DATAADMISSAO <= DATEADD(D,-1, DATEADD(M,1,CONVERT(DATETIME,TURNOVER.ANO+'-'+TURNOVER.MES+'-'+'01')))
    AND (A.CODSITUACAO <> 'D' OR (CODSITUACAO = 'D' 
    AND A.DATADEMISSAO > DATEADD(D,-1, DATEADD(M,1,CONVERT(DATETIME,TURNOVER.ANO+'-'+TURNOVER.MES+'-'+'01')))))
    AND A.CODSECAO = TURNOVER.CODIGO 
    ) AS FUNC_FIM_MES

    FROM (
    SELECT 
    P.CODCOLIGADA, 
    S.CODIGO, 
    S.DESCRICAO, 
    CAST(MONTH(P.DATAADMISSAO) AS VARCHAR(2)) MES, 
    CAST(YEAR(P.DATAADMISSAO) AS VARCHAR(4)) ANO, 
    COUNT(P.CHAPA) ADM, 
    0 DEM 
    FROM  PFUNC P 
    LEFT JOIN PFRATEIOFIXO R ON P.CODCOLIGADA = R.CODCOLIGADA AND P.CHAPA = R.CHAPA
    LEFT JOIN GCCUSTO G ON R.CODCOLIGADA = G.CODCOLIGADA AND R.CODCCUSTO = G.CODCCUSTO
    left  join PSECAO  AS S ON S.CODCOLIGADA = p.CODCOLIGADA       AND S.CODIGO = P.CODSECAO
    WHERE P.CODCOLIGADA ='9'
    AND YEAR (P.DATAADMISSAO) = '2016'
    GROUP BY P.CODCOLIGADA, S.CODIGO, S.DESCRICAO,
    CAST(MONTH(P.DATAADMISSAO) AS VARCHAR(2)), CAST(YEAR(P.DATAADMISSAO) AS VARCHAR(4))

    UNION ALL

    SELECT 
    P.CODCOLIGADA,
    S.CODIGO, 
    S.DESCRICAO,
    CAST(MONTH(P.DATADEMISSAO) AS VARCHAR(2)) MES, 
    CAST(YEAR(P.DATADEMISSAO) AS VARCHAR(4)) ANO, 
    0 ADM, 
    COUNT(P.CHAPA) DEM
    FROM PFUNC P
    LEFT JOIN PFRATEIOFIXO R ON P.CODCOLIGADA = R.CODCOLIGADA AND P.CHAPA = R.CHAPA
    LEFT JOIN GCCUSTO G ON R.CODCOLIGADA = G.CODCOLIGADA AND R.CODCCUSTO = G.CODCCUSTO
    left  join PSECAO  AS S ON S.CODCOLIGADA = p.CODCOLIGADA       AND S.CODIGO = P.CODSECAO
    WHERE P.CODCOLIGADA = '9'
    AND P.CODSITUACAO = 'D'
    AND YEAR (P.DATADEMISSAO) = '2016'
    GROUP BY P.CODCOLIGADA,

    S.CODIGO, 
    S.DESCRICAO,
    CAST(MONTH(P.DATADEMISSAO) AS VARCHAR(2)), 
    CAST(YEAR(P.DATADEMISSAO) AS VARCHAR(4))
    ) AS TURNOVER
    WHERE TURNOVER.MES = '9'
    GROUP BY 
    CODCOLIGADA,
    CODIGO,
    DESCRICAO, 
    ANO, 
    MES

    Resultado OK e isso mesmo

    COD ANO      MES CODIGO                 DESCRIÇÃO      ADMI DEM    INICIO_MES FIM_MES
    9 2016 9 01.001.0.00.001 BELO HORIZONTE 7 0    46                    47
    9 2016 9 01.002.0.00.001 RIO DE JANEIRO 0 1    2                     3
    9 2016 9 02.158.0.00.001 OBRA 158 a         2   308           304
    9 2016 9 02.158.0.00.002 OBRA 158 CI         5 1   282           294

    2 SQL Resultado OK tb

    COD ANO       MES CODIGO                 DESCRICAO            LIQUIDO
    9 2016 9 01.001.0.00.001 BELO HORIZONTE    153522.91
    9 2016 9 01.002.0.00.001 RIO DE JANEIRO    12268.50
    9 2016 9 02.158.0.00.001 OBRA 158 A            303594.64
    9 2016 9 02.158.0.00.002 OBRA 158 CI            356690.65

    Porem eu preciso UNIR a SQL 1 + a SQL 2,  Porem o resultado deve ser o Resultado da Primeira + LIQUIDO da 2 SQL

    Eu fiz dessa forma abaixo:

             

    with 
    /* TUNOVER */
    TUNOVER as (

    SELECT 
    CODCOLIGADA, 
    ANO, 
    MES, 
    CODIGO, 
    DESCRICAO, 
    SUM(ADM) ADMITIDOS, 
    SUM(DEM) DEMITIDOS,
    ( SELECT  COUNT(A.CHAPA)
    FROM PFUNC A
    LEFT JOIN PFRATEIOFIXO B ON A.CODCOLIGADA = B.CODCOLIGADA AND A.CHAPA = B.CHAPA
    WHERE A.CODCOLIGADA = TURNOVER.CODCOLIGADA 
    AND A.DATAADMISSAO < CONVERT(DATETIME,TURNOVER.ANO+'-'+TURNOVER.MES+'-'+'01')
    AND (A.CODSITUACAO <> 'D' OR ( A.CODSITUACAO = 'D' AND A.DATADEMISSAO > 
    CONVERT(DATETIME,TURNOVER.ANO+'-'+TURNOVER.MES+'-'+'01')))
                AND A.CODCOLIGADA = TURNOVER.CODCOLIGADA
    AND A.CODSECAO = TURNOVER.CODIGO
    ) AS FUNC_INICIO_MES,

    ( SELECT  COUNT(A.CHAPA)
    FROM PFUNC A
    LEFT JOIN PFRATEIOFIXO B ON A.CODCOLIGADA = B.CODCOLIGADA AND A.CHAPA = B.CHAPA
    WHERE A.CODCOLIGADA = TURNOVER.CODCOLIGADA 
    AND A.DATAADMISSAO <= DATEADD(D,-1, DATEADD(M,1,CONVERT(DATETIME,TURNOVER.ANO+'-'+TURNOVER.MES+'-'+'01')))
    AND (A.CODSITUACAO <> 'D' OR (CODSITUACAO = 'D' 
    AND A.DATADEMISSAO > DATEADD(D,-1, DATEADD(M,1,CONVERT(DATETIME,TURNOVER.ANO+'-'+TURNOVER.MES+'-'+'01')))))
    AND A.CODSECAO = TURNOVER.CODIGO 
    ) AS FUNC_FIM_MES

    FROM (
    SELECT 
    P.CODCOLIGADA, 
    S.CODIGO, 
    S.DESCRICAO, 
    CAST(MONTH(P.DATAADMISSAO) AS VARCHAR(2)) MES, 
    CAST(YEAR(P.DATAADMISSAO) AS VARCHAR(4)) ANO, 
    COUNT(P.CHAPA) ADM, 
    0 DEM 
    FROM  PFUNC P 
    LEFT JOIN PFRATEIOFIXO R ON P.CODCOLIGADA = R.CODCOLIGADA AND P.CHAPA = R.CHAPA
    LEFT JOIN GCCUSTO G ON R.CODCOLIGADA = G.CODCOLIGADA AND R.CODCCUSTO = G.CODCCUSTO
    left  join PSECAO  AS S ON S.CODCOLIGADA = p.CODCOLIGADA       AND S.CODIGO = P.CODSECAO
    WHERE P.CODCOLIGADA ='9'
    AND YEAR (P.DATAADMISSAO) = '2016'
    GROUP BY P.CODCOLIGADA, S.CODIGO, S.DESCRICAO,
    CAST(MONTH(P.DATAADMISSAO) AS VARCHAR(2)), CAST(YEAR(P.DATAADMISSAO) AS VARCHAR(4))

    UNION ALL

    SELECT 
    P.CODCOLIGADA,
    S.CODIGO, 
    S.DESCRICAO,
    CAST(MONTH(P.DATADEMISSAO) AS VARCHAR(2)) MES, 
    CAST(YEAR(P.DATADEMISSAO) AS VARCHAR(4)) ANO, 
    0 ADM, 
    COUNT(P.CHAPA) DEM
    FROM PFUNC P
    LEFT JOIN PFRATEIOFIXO R ON P.CODCOLIGADA = R.CODCOLIGADA AND P.CHAPA = R.CHAPA
    LEFT JOIN GCCUSTO G ON R.CODCOLIGADA = G.CODCOLIGADA AND R.CODCCUSTO = G.CODCCUSTO
    left  join PSECAO  AS S ON S.CODCOLIGADA = p.CODCOLIGADA       AND S.CODIGO = P.CODSECAO
    WHERE P.CODCOLIGADA = '9'
    AND P.CODSITUACAO = 'D'
    AND YEAR (P.DATADEMISSAO) = '2016'
    GROUP BY P.CODCOLIGADA,

    S.CODIGO, 
    S.DESCRICAO,
    CAST(MONTH(P.DATADEMISSAO) AS VARCHAR(2)), 
    CAST(YEAR(P.DATADEMISSAO) AS VARCHAR(4))
    ) AS TURNOVER
    WHERE TURNOVER.MES = '9'
    GROUP BY 
    CODCOLIGADA,
    CODIGO,
    DESCRICAO, 
    ANO, 
    MES


    ),
    LiquidoFolha as (
    SELECT 
    F.CODCOLIGADA,
    PFPERFF.ANOCOMP  ANO, 
    PFPERFF.MESCOMP  MES,
    S.CODIGO,
    S.DESCRICAO,
    SUM(LIQUIDO)LIQUIDO
    from PFPERFF 
    inner join PFUNC   AS F ON F.CODCOLIGADA = PFPERFF.CODCOLIGADA and F.CHAPA = PFPERFF.CHAPA
    left  join PSECAO  AS S ON S.CODCOLIGADA = F.CODCOLIGADA       AND S.CODIGO = F.CODSECAO
      where NROPERIODO = '4' 
            and PFPERFF.ANOCOMP = '2016'
    AND PFPERFF.MESCOMP = '9'
            and PFPERFF.CODCOLIGADA = '9'


            GROUP BY PFPERFF.MESCOMP,S.CODIGO,F.CODCOLIGADA,PFPERFF.ANOCOMP,
    S.DESCRICAO
    )
    /* RESULTADO FINAL */
    SELECT 
    T1.MES,
    T1.CODIGO,
    T1.DESCRICAO,
    T1.ADMITIDOS,
    T1.DEMITIDOS,
    T1.FUNC_INICIO_MES,
    T1.FUNC_FIM_MES,
    SUM(T2.LIQUIDO)




      from TUNOVER as T1
       LEFT join LiquidoFolha AS T2 ON T2.MES = T1.MES 

        WHERE T1.MES = '9' 
    AND T1.MES = '9'
        GROUP BY 
        T1.MES,
    T1.CODIGO,

    T1.DESCRICAO,
    T1.ADMITIDOS,
    T1.DEMITIDOS,
    T1.FUNC_INICIO_MES,
    T1.FUNC_FIM_MES

      ORDER BY T1.MES

    Porem ele Soma o Valor Liquido TOTAL ESTA Somando total. 

    MES CODIGO                 DESCRIÇÃO            ADM DEM INICIO_MES FIM_MES     LIQUIDO
    9 01.001.0.00.001 BELO HORIZONTE     7           0    46                    47                 826076.70
    9 01.002.0.00.001 RIO DE JANEIRO     0           1     2                     3                 826076.70
    9 02.158.0.00.001 OBRA 158 A             2           5    308           304         826076.70
    9 02.158.0.00.002 OBRA 158 CI                5           1    282           294         826076.70

    sábado, 5 de novembro de 2016 19:17

Respostas

  • Porem eu preciso UNIR a SQL 1 + a SQL 2,  Porem o resultado deve ser o Resultado da Primeira + LIQUIDO da 2 SQL

    vou te dar uma abordagem que resolve seu problema de forma simples, outras abordagens podem também existir,

    inicialmente

    1)vc só vai conseguir unir( Union ou Union All), se a estrutura do seu resultado for o mesmo em ambos.

    seu primeiro Select retorna os campos 

    cod int, Ano int,  Mes int, Codigo varchar(max), Descricao varchar(max), ADMI int, DEM int, Inicio_Mes int, FIM_MES int,

    seu segundo select retorna os campos

     

    cod int, Ano int, Mes int, Codigo varchar(max), Descricao varchar(max),Liquido decimal(18,2)

    o operador Union necessariamente pede dois resultados com a mesma quantidade de campos e mesmo tipo de dados

    logo veja a solução que fiz

    1) declarei uma variável table com o resultado do primeiro select postado e para o campo LIQUIDO coloquei o valor ZERO

    declare @ResultadoDoPrimeiroSelect table(
    cod int,
    Ano int,
    Mes int,
    Codigo varchar(max),
    Descricao varchar(max),
    ADMI int,
    DEM int,
    Inicio_Mes int,
    FIM_MES int,
    Liquido decimal(18,2) )
    
    
    --Resultado OK e isso mesmo
    insert into  @ResultadoDoPrimeiroSelect
    values
    (9, 2016, 9,'01.001.0.00.001', 'BELO HORIZONTE', 7,  0, 46, 47,0),
    (9, 2016, 9,'01.002.0.00.001', 'RIO DE JANEIRO', 0,1,2 ,3,0),
    (9, 2016, 9,'02.158.0.00.001', 'OBRA 158 a', 2 ,5 ,308 ,304,0),
    (9, 2016, 9,'02.158.0.00.002', 'OBRA 158 CI', 5 ,5 ,282 ,294,0);


    agora para o resultado do seu segundo select fiz a mesma coisa ,porem para os outros campos que vc retorna

    declare @ResultadoDoSegundoSelect table(
    cod int,
    Ano int,
    Mes int,
    Codigo varchar(max),
    Descricao varchar(max),
    ADMI int,
    DEM int,
    Inicio_Mes int,
    FIM_MES int,
    Liquido decimal(18,2)
     )
    
    
    
    insert into  @ResultadoDoSegundoSelect
    values
    (9, 2016, 9,'01.001.0.00.001', 'BELO HORIZONTE',0,0,0,0, 153522.91),
    (9, 2016, 9,'01.002.0.00.001', 'RIO DE JANEIRO',0,0,0,0, 12268.50),
    (9, 2016, 9,'02.158.0.00.001', 'OBRA 158 a', 0,0,0,0,303594.64),
    (9, 2016, 9,'02.158.0.00.002', 'OBRA 158 CI',0,0,0,0, 356690.65);

    agora vejamos nos temos duas tabelas com a mesma estruturas .

    agora vc pode criar o resultado final fazendo assim

    select
    Retorno.cod ,
    Retorno.Ano ,
    Retorno.Mes ,
    Retorno.Codigo,
    Retorno.Descricao ,
    Sum(Retorno.ADMI) ADMI,
    Sum(Retorno.DEM) DEM,
    Sum(Retorno.Inicio_Mes) Inicio_Mes,
    Sum(Retorno.FIM_MES) FIM_MES,
    Sum(Retorno.Liquido) Liquido

     from (

    select * from @ResultadoDoPrimeiroSelect
    union all
    select * from @ResultadoDoSegundoSelect)as Retorno
    group by 
    cod ,
    Ano ,
    Mes ,
    Codigo,
    Descricao 

    --Simples e direito








    Wesley Neves


    domingo, 6 de novembro de 2016 18:17