Usuário com melhor resposta
Inserir registros de um scrip em uma tabela que já existe

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á
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
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
-
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??
- Editado carine.couto quinta-feira, 17 de março de 2016 14:24 ajuste
- Sugerido como Resposta Junior Galvão - MVPMVP quinta-feira, 17 de março de 2016 16:06
-
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
-
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)
-
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
-