Alunos Cristiane galdino da silva Postado Maio 28 Alunos Compartilhar Postado Maio 28 Gente, boa tarde. Tenho uma consulta SQL que me retorna a tabela, mas quero que fique como a tabela 2. Quero que o primeiro registro seja repetido, acrescentando um mês a data, até a data da proxima alteração. Sabem o que posso usar para faser isso? 1 Link para o comentário Compartilhar em outros sites More sharing options...
0 Alunos Alex Pereira Postado Maio 28 Alunos Compartilhar Postado Maio 28 46 minutos atrás, Cristiane galdino da silva disse: Gente, boa tarde. Tenho uma consulta SQL que me retorna a tabela, mas quero que fique como a tabela 2. Quero que o primeiro registro seja repetido, acrescentando um mês a data, até a data da proxima alteração. Sabem o que posso usar para faser isso? Qual sgdb você está utilizando? 1 Link para o comentário Compartilhar em outros sites More sharing options...
0 Alunos Alex Pereira Postado Maio 28 Alunos Compartilhar Postado Maio 28 Consegue disponibilizar a query com uma versão simplificada do seu database? Link para o comentário Compartilhar em outros sites More sharing options...
0 Alunos Alex Pereira Postado Maio 28 Alunos Compartilhar Postado Maio 28 Exemplo de aplicação sql server: Explicação: 1 - DateSeries CTE: Gera uma série de datas começando em '2023-04-01' e incrementando mensalmente até '2024-01-01'. 2 - Data CTE: Define os dados fornecidos no exemplo. 3 - Consulta principal: Junta as datas geradas com os dados originais, garantindo que as datas sejam maiores ou iguais à data de alteração de cada chapa. 4 - ORDER BY: Ordena o resultado por Chapa e data. 5 - OPTION (MAXRECURSION 0): Permite que a CTE recursiva execute sem o limite padrão de 100 recursões. WITH DateSeries AS ( SELECT CAST('2023-04-01' AS DATE) AS Date UNION ALL SELECT DATEADD(MONTH, 1, Date) FROM DateSeries WHERE DATEADD(MONTH, 1, Date) <= '2024-01-01' ), Data AS ( SELECT 'SPV02031008' AS CentroCusto, 24694 AS Chapa, CAST('2023-04-01' AS DATE) AS AlteracaoCentroCusto UNION ALL SELECT 'SPV0204002', 24694, CAST('2024-01-01' AS DATE) ) SELECT d.CentroCusto, d.Chapa, ds.Date AS AlteracaoCentroCusto FROM Data d JOIN DateSeries ds ON ds.Date >= d.AlteracaoCentroCusto ORDER BY d.Chapa, ds.Date OPTION (MAXRECURSION 0); Link para o comentário Compartilhar em outros sites More sharing options...
0 Alunos Cristiane galdino da silva Postado Maio 28 Autor Alunos Compartilhar Postado Maio 28 (editado) Esqueci de mencionar. A TI não quer fazer nada no banco de dados. Eu uso um sistema que me permite fazer as querys, mas não consigo criar CTEs , TB temporária. Pensei em fazer algo dentro do Power Query também, mas ainda não consegui chegar a uma solução. Editado Maio 28 por Cristiane galdino da silva Link para o comentário Compartilhar em outros sites More sharing options...
0 Alunos Alex Pereira Postado Maio 29 Alunos Compartilhar Postado Maio 29 15 horas atrás, Cristiane galdino da silva disse: Esqueci de mencionar. A TI não quer fazer nada no banco de dados. Eu uso um sistema que me permite fazer as querys, mas não consigo criar CTEs , TB temporária. Pensei em fazer algo dentro do Power Query também, mas ainda não consegui chegar a uma solução. Tenho essa solução tente replicar seu conjunto de dados: Link para o comentário Compartilhar em outros sites More sharing options...
0 Alunos Cristiane galdino da silva Postado Maio 29 Autor Alunos Compartilhar Postado Maio 29 2 horas atrás, Alex Pereira disse: Tenho essa solução tente replicar seu conjunto de dados: Alex, bom dia. Obrigada pela ajuda. O código M que vc compartilhou comigo está dando estouro de pilha. Acredito eu que seja porque a tabela original possui 13000 linhas. Como eu quero que seja retornada apenas uma data em cada mês, troquei a duração para 30, porque só preciso saber o mês e o ano que teve a alteração. Vou te enviar o arquivo em Excel, pode ver se consegue me ajudar? Alteracao_centro_custo.xlsx Link para o comentário Compartilhar em outros sites More sharing options...
0 Alunos Alex Pereira Postado Maio 29 Alunos Compartilhar Postado Maio 29 Você quer que repita só nos casos numero de matricula é igual? Ex: SPV01000001 14 18/03/2024 SPV02062002 14 01/01/2013 Resultado esperado: SPV02062002 14 01/01/2013 SPV02062002 14 01/02/2013 SPV02062002 14 01/03/2013 . . . SPV02062002 14 01/01/2024 SPV02062002 14 01/02/2024 SPV01000001 14 18/03/2024 Link para o comentário Compartilhar em outros sites More sharing options...
0 Alunos Cristiane galdino da silva Postado Maio 29 Autor Alunos Compartilhar Postado Maio 29 54 minutos atrás, Alex Pereira disse: Você quer que repita só nos casos numero de matricula é igual? Ex: SPV01000001 14 18/03/2024 SPV02062002 14 01/01/2013 Resultado esperado: SPV02062002 14 01/01/2013 SPV02062002 14 01/02/2013 SPV02062002 14 01/03/2013 . . . SPV02062002 14 01/01/2024 SPV02062002 14 01/02/2024 SPV01000001 14 18/03/2024 Isso mesmo. Link para o comentário Compartilhar em outros sites More sharing options...
0 Alunos Alex Pereira Postado Junho 24 Alunos Compartilhar Postado Junho 24 Segue Codigo Atualizado: let Fonte = Table.FromRecords({ [ALTERACAO_CENTRO_CUSTO=#date(2022, 1, 11), MATRICULA=12981, CENTRO_CUSTO=1347.38], [ALTERACAO_CENTRO_CUSTO=#date(2022, 1, 13), MATRICULA=12981, CENTRO_CUSTO=1891.89], [ALTERACAO_CENTRO_CUSTO=#date(2022, 1, 15), MATRICULA=12981, CENTRO_CUSTO=1891.89], [ALTERACAO_CENTRO_CUSTO=#date(2022, 1, 14), MATRICULA=12981, CENTRO_CUSTO=1247.38], [ALTERACAO_CENTRO_CUSTO=#date(2022, 2, 16), MATRICULA=12981, CENTRO_CUSTO=1347.38] }), // Substitua pela sua fonte de dados original Ordenado = Table.Sort(Fonte, {{"MATRICULA", Order.Ascending}, {"ALTERACAO_CENTRO_CUSTO", Order.Ascending}}), MatriculasUnicas = List.Distinct(Ordenado[MATRICULA]), TabelaExpandida = List.Accumulate( MatriculasUnicas, Table.FromRecords({}), (tabela, matriculaAtual) => let Filtrado = Table.SelectRows(Ordenado, each [MATRICULA] = matriculaAtual), MinData = List.Min(Filtrado[ALTERACAO_CENTRO_CUSTO]), MaxData = List.Max(Filtrado[ALTERACAO_CENTRO_CUSTO]), QtdDias = Duration.Days(MaxData - MinData), DatasFiltrado = List.Dates(MinData, QtdDias + 1, #duration(1, 0, 0, 0)), Expandido = List.Accumulate( DatasFiltrado, tabela, (tabelaInterna, dataAtual) => let Linha = Table.SelectRows(Filtrado, each [ALTERACAO_CENTRO_CUSTO] <= dataAtual), UltimaLinha = Table.Last(Linha), ListaDeValores = {dataAtual, UltimaLinha[MATRICULA], UltimaLinha[CENTRO_CUSTO]}, NovoRegistro = Record.FromList(ListaDeValores, {"ALTERACAO_CENTRO_CUSTO", "MATRICULA", "CENTRO_CUSTO"}), ListaDeRegistros = Table.ToRecords(tabelaInterna) in Table.FromRecords(ListaDeRegistros & {NovoRegistro}) ) in Expandido ) in TabelaExpandida Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
Cristiane galdino da silva
Gente, boa tarde.
Tenho uma consulta SQL que me retorna a tabela, mas quero que fique como a tabela 2.
Quero que o primeiro registro seja repetido, acrescentando um mês a data, até a data da proxima alteração.
Sabem o que posso usar para faser isso?
Link para o comentário
Compartilhar em outros sites
9 respostass a esta questão
Posts Recomendados
Faça login para comentar
Você vai ser capaz de deixar um comentário após fazer o login
Entrar Agora