none
Inserir registros de um scrip em uma tabela que já existe RRS feed

  • Pergunta

  • Bom dia !

    Gostaria de pedir uma ajudinha a vcs.

    Na tentativa da automatização de uma rotina me deparei com um seguinte problema:
    Tem um script que o seu resultado precisa ser inserido dentro de uma tabela que já existe e já possui outros valores

    Script é esse:

    DECLARE @inicio DATETIME, @fim DATETIME
    SELECT @inicio = '2015-01-31', @fim = '2016-01-31' 
    ;WITH CTE AS
    (
    Select @inicio  as Data,Case When DatePart(mm,@inicio)<>DatePart(mm,@inicio+1) then 1 else 0 end as Ultimo
    UNION ALL
    Select Data+1,Case When DatePart(mm,Data+1)<>DatePart(mm,Data+2) then 1 else 0 end from CTE
    Where Data<@fim
    )
    SELECT '01' AS EMPRESA , FILIAL, CC, YEAR(Data) ANO, MONTH(DATA) MES, 
    (SELECT COUNT(DISTINCT MAT) FROM FUNC F2 WHERE SUBSTRING(CAST(DEM AS VARCHAR(MAX)), 1, 6) = SUBSTRING(CAST(DATA AS VARCHAR(MAX)), 1, 6) 
    AND F2.FILIAL = FUNC.FILIAL AND F2.CC = FUNC.CC AND D_E_L_E_T_ <> '*') DEMITIDOS_MES, 
    (SELECT COUNT(DISTINCT MAT) FROM FUNC F2 WHERE SUBSTRING(CAST(ADM AS VARCHAR(MAX)), 1, 6) = SUBSTRING(CAST(DATA AS VARCHAR(MAX)), 1, 6)
     AND F2.FILIAL = FUNC.FILIAL AND F2.CC = FUNC.CC AND D_E_L_E_T_ <> '*') ADMITIDOS_MES, 
    (SELECT COUNT(1) FROM 
    FUNC T
    WHERE  (ADM <= Data)
    AND   T.FILIAL = FUNC.FILIAL
    AND (DEMISSA > Data OR DEMISSA = '')
    AND T.CC = FUNC.CC
    AND D_E_L_E_T_ <> '*') QTD FROM
    (SELECT DISTINCT  FILIAL, CC, CONVERT(VARCHAR(MAX), Data, 112) Data FROM CTE CROSS JOIN dadosadv10.dbo.SRA010
    where Ultimo = 1
    ) FUNC
    ORDER BY RA_FILIAL, ANO, CC, MES DESC
    OPTION (MAXRECURSION 0)

    Preciso inserir seu resultado na tabela

    qtd_func

    Isso é possivel?

    Alguém poderia me ajudar ?

    Muito obrigada desde já

    quinta-feira, 17 de março de 2016 13:58

Respostas

  • Boa tarde,

    Experimente dessa forma:

    DECLARE @inicio DATETIME, @fim DATETIME
    SELECT @inicio = '2016-03-31', @fim = '2016-04-30' 
    ;WITH CTE AS
    (
    Select @inicio  as Data,Case When DatePart(mm,@inicio)<>DatePart(mm,@inicio+1) then 1 else 0 end as Ultimo
    UNION ALL
    Select Data+1,Case When DatePart(mm,Data+1)<>DatePart(mm,Data+2) then 1 else 0 end from CTE
    Where Data<@fim
    )
    
    INSERT INTO func_adm_dem_periodo (EMPRESA, FILIAL, CCUSTO, ANO, MES,QTD_DEM, QTD_ADM,QTD)
    
    SELECT '01' AS EMPRESA , RA_FILIAL, RA_CC, YEAR(Data) ANO, MONTH(DATA) MES, 
    (SELECT COUNT(DISTINCT RA_MAT) FROM FUNC F2 WHERE SUBSTRING(CAST(RA_DEMISSA AS VARCHAR(MAX)), 1, 6) = SUBSTRING(CAST(DATA AS VARCHAR(MAX)), 1, 6) 
    AND F2.RA_FILIAL = FUNC.RA_FILIAL AND F2.RA_CC = FUNC.RA_CC AND D_E_L_E_T_ <> '*') DEMITIDOS_MES, 
    (SELECT COUNT(DISTINCT RA_MAT) FROM FUNC F2 WHERE SUBSTRING(CAST(RA_ADMISSA AS VARCHAR(MAX)), 1, 6) = SUBSTRING(CAST(DATA AS VARCHAR(MAX)), 1, 6)
     AND F2.RA_FILIAL = FUNC.RA_FILIAL AND F2.RA_CC = FUNC.RA_CC AND D_E_L_E_T_ <> '*') ADMITIDOS_MES, 
    (SELECT COUNT(1) FROM 
    FUNC T
    WHERE  (RA_ADMISSA <= Data)
    AND   T.RA_FILIAL = FUNC.RA_FILIAL
    AND (RA_DEMISSA > Data OR RA_DEMISSA = '')
    AND T.RA_CC = FUNC.RA_CC
    AND D_E_L_E_T_ <> '*') QTD FROM
    (SELECT DISTINCT  RA_FILIAL, RA_CC, CONVERT(VARCHAR(MAX), Data, 112) Data FROM CTE CROSS JOIN FUNC
    where Ultimo = 1
    ) FUNC
    --WHERE RA_FILIAL = 1
    ORDER BY RA_FILIAL, ANO, RA_CC, MES DESC
    OPTION (MAXRECURSION 0)

    Espero que ajude


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

    • Marcado como Resposta carine.couto quinta-feira, 17 de março de 2016 17:12
    quinta-feira, 17 de março de 2016 16:58

Todas as Respostas

  • Bom dia, Carine,

    Os campos que serão inseridos na tabela 'QTDE_FUNC', são exatamente os campos que esse SELECT está retornando?

    Caso seja, basta fazer INSERT INTO (CAMPOS...) SEU SELECT.

    Um detalhe que deve-se levar em consideração é, caso o registro já exista na tabela 'QTD_FUNC', será feito UPDATE?


    Atenciosamente, Ruberlei. www.t-sql.com.br

    quinta-feira, 17 de março de 2016 14:14
  • Os campos que serão inseridos na tabela 'QTDE_FUNC', são exatamente os campos que esse SELECT está retornando?

    Sim

    Então ficaria assim?



    INSERT INTO QTDE_FUNC (empresa, filial, ano, mes, demitidos, admitidos, qtd) 

    select (

    DECLARE @inicio DATETIME, @fim DATETIME SELECT @inicio = '2015-01-31', @fim = '2016-01-31' ;WITH CTE AS ( Select @inicio as Data,Case When DatePart(mm,@inicio)<>DatePart(mm,@inicio+1) then 1 else 0 end as Ultimo UNION ALL Select Data+1,Case When DatePart(mm,Data+1)<>DatePart(mm,Data+2) then 1 else 0 end from CTE Where Data<@fim ) SELECT '01' AS EMPRESA , FILIAL, CC, YEAR(Data) ANO, MONTH(DATA) MES, (SELECT COUNT(DISTINCT MAT) FROM FUNC F2 WHERE SUBSTRING(CAST(DEM AS VARCHAR(MAX)), 1, 6) = SUBSTRING(CAST(DATA AS VARCHAR(MAX)), 1, 6) AND F2.FILIAL = FUNC.FILIAL AND F2.CC = FUNC.CC AND D_E_L_E_T_ <> '*') DEMITIDOS_MES, (SELECT COUNT(DISTINCT MAT) FROM FUNC F2 WHERE SUBSTRING(CAST(ADM AS VARCHAR(MAX)), 1, 6) = SUBSTRING(CAST(DATA AS VARCHAR(MAX)), 1, 6) AND F2.FILIAL = FUNC.FILIAL AND F2.CC = FUNC.CC AND D_E_L_E_T_ <> '*') ADMITIDOS_MES, (SELECT COUNT(1) FROM FUNC T WHERE (ADM <= Data) AND T.FILIAL = FUNC.FILIAL AND (DEMISSA > Data OR DEMISSA = '') AND T.CC = FUNC.CC AND D_E_L_E_T_ <> '*') QTD FROM (SELECT DISTINCT FILIAL, CC, CONVERT(VARCHAR(MAX), Data, 112) Data FROM CTE CROSS JOIN dadosadv10.dbo.SRA010 where Ultimo = 1 ) FUNC ORDER BY RA_FILIAL, ANO, CC, MES DESC OPTION (MAXRECURSION 0)

    )

    asssim??


    quinta-feira, 17 de março de 2016 14:21
  • Bom dia,

    Seria basicamente isso, mas pelo que vi o Select está retornando uma coluna a mais (CC), então seria necessário remover essa coluna do Select ou acrescenta-la na tabela de destino.

    Espero que ajude


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

    quinta-feira, 17 de março de 2016 15:16
  • Boa tarde.

    Executei o comando e está dando o seguite erro

    Mensagem 156, Nível 15, Estado 1, Linha 5
    Incorrect syntax near the keyword 'DECLARE'.

    Script que executei:

    INSERT INTO func_adm_dem_periodo (EMPRESA, FILIAL, CCUSTO, ANO, MES,QTD_DEM, QTD_ADM,QTD)
    SELECT
    DECLARE @inicio DATETIME, @fim DATETIME
    SELECT @inicio = '2016-03-31', @fim = '2016-04-30' 
    ;WITH CTE AS
    (
    Select @inicio  as Data,Case When DatePart(mm,@inicio)<>DatePart(mm,@inicio+1) then 1 else 0 end as Ultimo
    UNION ALL
    Select Data+1,Case When DatePart(mm,Data+1)<>DatePart(mm,Data+2) then 1 else 0 end from CTE
    Where Data<@fim
    )
    SELECT '01' AS EMPRESA , RA_FILIAL, RA_CC, YEAR(Data) ANO, MONTH(DATA) MES, 
    (SELECT COUNT(DISTINCT RA_MAT) FROM FUNC F2 WHERE SUBSTRING(CAST(RA_DEMISSA AS VARCHAR(MAX)), 1, 6) = SUBSTRING(CAST(DATA AS VARCHAR(MAX)), 1, 6) 
    AND F2.RA_FILIAL = FUNC.RA_FILIAL AND F2.RA_CC = FUNC.RA_CC AND D_E_L_E_T_ <> '*') DEMITIDOS_MES, 
    (SELECT COUNT(DISTINCT RA_MAT) FROM FUNC F2 WHERE SUBSTRING(CAST(RA_ADMISSA AS VARCHAR(MAX)), 1, 6) = SUBSTRING(CAST(DATA AS VARCHAR(MAX)), 1, 6)
     AND F2.RA_FILIAL = FUNC.RA_FILIAL AND F2.RA_CC = FUNC.RA_CC AND D_E_L_E_T_ <> '*') ADMITIDOS_MES, 
    (SELECT COUNT(1) FROM 
    FUNC T
    WHERE  (RA_ADMISSA <= Data)
    AND   T.RA_FILIAL = FUNC.RA_FILIAL
    AND (RA_DEMISSA > Data OR RA_DEMISSA = '')
    AND T.RA_CC = FUNC.RA_CC
    AND D_E_L_E_T_ <> '*') QTD FROM
    (SELECT DISTINCT  RA_FILIAL, RA_CC, CONVERT(VARCHAR(MAX), Data, 112) Data FROM CTE CROSS JOIN FUNC
    where Ultimo = 1
    ) FUNC
    --WHERE RA_FILIAL = 1
    ORDER BY RA_FILIAL, ANO, RA_CC, MES DESC
    OPTION (MAXRECURSION 0)
    

    quinta-feira, 17 de março de 2016 16:42
  • Boa tarde,

    Experimente dessa forma:

    DECLARE @inicio DATETIME, @fim DATETIME
    SELECT @inicio = '2016-03-31', @fim = '2016-04-30' 
    ;WITH CTE AS
    (
    Select @inicio  as Data,Case When DatePart(mm,@inicio)<>DatePart(mm,@inicio+1) then 1 else 0 end as Ultimo
    UNION ALL
    Select Data+1,Case When DatePart(mm,Data+1)<>DatePart(mm,Data+2) then 1 else 0 end from CTE
    Where Data<@fim
    )
    
    INSERT INTO func_adm_dem_periodo (EMPRESA, FILIAL, CCUSTO, ANO, MES,QTD_DEM, QTD_ADM,QTD)
    
    SELECT '01' AS EMPRESA , RA_FILIAL, RA_CC, YEAR(Data) ANO, MONTH(DATA) MES, 
    (SELECT COUNT(DISTINCT RA_MAT) FROM FUNC F2 WHERE SUBSTRING(CAST(RA_DEMISSA AS VARCHAR(MAX)), 1, 6) = SUBSTRING(CAST(DATA AS VARCHAR(MAX)), 1, 6) 
    AND F2.RA_FILIAL = FUNC.RA_FILIAL AND F2.RA_CC = FUNC.RA_CC AND D_E_L_E_T_ <> '*') DEMITIDOS_MES, 
    (SELECT COUNT(DISTINCT RA_MAT) FROM FUNC F2 WHERE SUBSTRING(CAST(RA_ADMISSA AS VARCHAR(MAX)), 1, 6) = SUBSTRING(CAST(DATA AS VARCHAR(MAX)), 1, 6)
     AND F2.RA_FILIAL = FUNC.RA_FILIAL AND F2.RA_CC = FUNC.RA_CC AND D_E_L_E_T_ <> '*') ADMITIDOS_MES, 
    (SELECT COUNT(1) FROM 
    FUNC T
    WHERE  (RA_ADMISSA <= Data)
    AND   T.RA_FILIAL = FUNC.RA_FILIAL
    AND (RA_DEMISSA > Data OR RA_DEMISSA = '')
    AND T.RA_CC = FUNC.RA_CC
    AND D_E_L_E_T_ <> '*') QTD FROM
    (SELECT DISTINCT  RA_FILIAL, RA_CC, CONVERT(VARCHAR(MAX), Data, 112) Data FROM CTE CROSS JOIN FUNC
    where Ultimo = 1
    ) FUNC
    --WHERE RA_FILIAL = 1
    ORDER BY RA_FILIAL, ANO, RA_CC, MES DESC
    OPTION (MAXRECURSION 0)

    Espero que ajude


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

    • Marcado como Resposta carine.couto quinta-feira, 17 de março de 2016 17:12
    quinta-feira, 17 de março de 2016 16:58
  • Muito Obrigada!
    Deu certo! :)
    quinta-feira, 17 de março de 2016 17:13