Usuário com melhor resposta
Consolidar registros por data

Pergunta
-
Olá a todos!
Gostaria de ajuda para saber como consolidar os registros de uma tabela onde os dados estão sempre dispostos de 1 a 31. A minha tabela possui vários registros do mesmo dia, por exemplo, pode haver 5 registros do dia 01/08/2015, 20 registros do dia 04/08/2015 e existe a possibilidade também de não haver nenhum registro de um ou mais dias do mês. Independente da quantidade e dos dias, o que eu preciso é que a consulta retorne os dados de forma consolidada seguindo os seguintes critérios:
- Retornar dados de 1 a 31 do mês (Não necessariamente haverá registros de todos os dias do mês)
- Somar as colunas do tipo Hora de acordo com a data correspondente.
- Contar no campo "StatusDaChamada" quantas vezes aparece as nomenclaturas "Atendidas" e "Não Atendidas" para inserir as respectivas quantidades de acordo com a data correspondente
Abaixo um print da minha tabela chamada "tblExtracao":
Desde já agradeço a ajuda de todos
Att
Eduardo
Respostas
-
Boa tarde,
Experimente mais ou menos dessa forma:
with CTE_Datas as ( select @DataIni as Data union all select DATEADD(DAY, 1, Data) from CTE_Datas where Data < @DataFim ) select d.Data, DATEADD(SECOND, SUM(DATEDIFF(SECOND, 0, e.ChamadaEmEspera)), 0) as ChamadaEmEspera, DATEADD(SECOND, SUM(DATEDIFF(SECOND, 0, e.DuracaoDaChamada)), 0) as DuracaoDaChamada, COUNT(CASE WHEN e.StatusDaChamada = 'Atendida' then 1 end) as Atendidas, COUNT(CASE WHEN e.StatusDaChamada = 'Não Atendida' then 1 end) as NaoAtendidas from CTE_Datas as d left join TblExtracao as e on e.Data = d.Data group by d.Data
obs: @DataIni e @DataFim seriam parâmetros que conteriam a data inicial e a data final do periodo
Espero que ajude.
Assinatura: http://www.imoveisemexposicao.com.br
- Marcado como Resposta Marcos SJ sexta-feira, 7 de agosto de 2015 20:08
- Não Marcado como Resposta eddu951 sábado, 8 de agosto de 2015 01:46
- Sugerido como Resposta Junior Galvão - MVPMVP terça-feira, 11 de agosto de 2015 18:58
- Marcado como Resposta Marcos SJ quarta-feira, 12 de agosto de 2015 20:20
Todas as Respostas
-
Olá Eduardo,
Tudo bem?
Poderia mostrar o código que está criando para efetuar estas ações e apontar em que ponto você tem dúvida?
Ou se for o caso explicar porque você não está conseguindo executar estas funções em seu projeto.
Atenciosamente
Marcos Roberto de Souza Junior
Esse conteúdo e fornecido sem garantias de qualquer tipo, seja expressa ou implícita
MSDN Community Support
Por favor, lembre-se de Marcar como Resposta as respostas que resolveram o seu problema. Essa e uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.
-
Olá Marcos,
Eu não tenho a query, o mais próximo que eu consegui chegar foi fazer um SELECT, porém ele retorna uma única linha consolidando todos os dias.
Mas o que eu preciso é que ele retorne o consolidado por dia.
Atenciosamente,
Eduardo
-
Olá Eduardo,
Como você quer algo pronto e específico para o seu projeto com detalhes, eu sugiro que você consulte um profissional que possa fazer uma análise de seu projeto para poder codificar esta parte de seu projeto.
Atencisoamente
Marcos Roberto de Souza Junior
Esse conteúdo e fornecido sem garantias de qualquer tipo, seja expressa ou implícita
MSDN Community Support
Por favor, lembre-se de Marcar como Resposta as respostas que resolveram o seu problema. Essa e uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.
-
Olha só.. fazer essas coisas SQL nunca é uma boa opção, mas não vou questionar seu ambiente. Mas tenha em mente que sempre é melhor fazer esse tipo de coisa via código, e nunca via SQL.
Enfim.. seria isso?
declare @periodoAnalisado as Datetime set @periodoAnalisado = GETDATE() declare @primeiroDiaMes as Datetime declare @ultimoDiaMes as Datetime set @primeiroDiaMes = CONVERT(VARCHAR(25),DATEADD(dd,-(DAY(@periodoAnalisado)-1),@periodoAnalisado),101) set @ultimoDiaMes = CONVERT(VARCHAR(25),DATEADD(dd,-(DAY(DATEADD(mm,1,@periodoAnalisado))),DATEADD(mm,1,@periodoAnalisado)),101) CREATE TABLE #DADOS(Data Datetime, ChamadaEspera time, DuracaoChamada time, Situacao varchar(100)) CREATE TABLE #RESULTADO(Data Datetime, TotalHoraEspera int, TotalHoraChamada int, Situacao varchar(100)) insert into #DADOS values ('2015-08-01', '00:00:10', '00:00:20', 'Atendido') insert into #DADOS values ('2015-08-01', '00:00:20', '00:00:30', 'Não atendido') insert into #DADOS values ('2015-08-20', '00:00:30', '00:00:40', 'Atendido') insert into #DADOS values ('2015-08-25', '00:00:40', '00:00:50', 'Atendido') insert into #DADOS values ('2015-08-26', '00:00:50', '00:00:59', 'Não atendido') insert into #DADOS values ('2015-08-26', '00:00:30', '00:00:59', 'Não atendido') declare @dataInicio as datetime set @dataInicio = @primeiroDiaMes declare @dataRetorno as datetime WHILE (@dataInicio <= @ultimoDiaMes) BEGIN insert into #RESULTADO values (@dataInicio, 0, 0, 'Nenhuma ocorrência') set @dataInicio = DATEADD(DAY, 1, @dataInicio) END DECLARE @Data datetime, @ChamadaEspera time, @DuracaoChamada time, @Situacao varchar(100); DECLARE vendor_cursor CURSOR FOR SELECT Data, ChamadaEspera, DuracaoChamada, Situacao FROM #DADOS OPEN vendor_cursor FETCH NEXT FROM vendor_cursor INTO @Data, @ChamadaEspera, @DuracaoChamada, @Situacao WHILE @@FETCH_STATUS = 0 BEGIN update #RESULTADO set TotalHoraEspera = (select SUM(DATEDIFF(SECOND, '00:00:00', ChamadaEspera)) from #DADOS where Data = @Data), TotalHoraChamada = (select SUM(DATEDIFF(SECOND, '00:00:00', DuracaoChamada)) from #DADOS where Data = @Data), Situacao = @Situacao where Data = @Data FETCH NEXT FROM vendor_cursor INTO @Data, @ChamadaEspera, @DuracaoChamada, @Situacao END CLOSE vendor_cursor; DEALLOCATE vendor_cursor; select * from #DADOS select * from #RESULTADO drop table #DADOS drop table #RESULTADO
- Sugerido como Resposta Junior Galvão - MVPMVP terça-feira, 11 de agosto de 2015 18:58
-
Boa tarde,
Experimente mais ou menos dessa forma:
with CTE_Datas as ( select @DataIni as Data union all select DATEADD(DAY, 1, Data) from CTE_Datas where Data < @DataFim ) select d.Data, DATEADD(SECOND, SUM(DATEDIFF(SECOND, 0, e.ChamadaEmEspera)), 0) as ChamadaEmEspera, DATEADD(SECOND, SUM(DATEDIFF(SECOND, 0, e.DuracaoDaChamada)), 0) as DuracaoDaChamada, COUNT(CASE WHEN e.StatusDaChamada = 'Atendida' then 1 end) as Atendidas, COUNT(CASE WHEN e.StatusDaChamada = 'Não Atendida' then 1 end) as NaoAtendidas from CTE_Datas as d left join TblExtracao as e on e.Data = d.Data group by d.Data
obs: @DataIni e @DataFim seriam parâmetros que conteriam a data inicial e a data final do periodo
Espero que ajude.
Assinatura: http://www.imoveisemexposicao.com.br
- Marcado como Resposta Marcos SJ sexta-feira, 7 de agosto de 2015 20:08
- Não Marcado como Resposta eddu951 sábado, 8 de agosto de 2015 01:46
- Sugerido como Resposta Junior Galvão - MVPMVP terça-feira, 11 de agosto de 2015 18:58
- Marcado como Resposta Marcos SJ quarta-feira, 12 de agosto de 2015 20:20
-
Boa tarde,
Por falta de retorno do usuário, esta thread será encerrada.
Caso seja necessário, por gentileza, abra uma thread nova.
Atenciosamente
Marcos Roberto de Souza Junior
Esse conteúdo e fornecido sem garantias de qualquer tipo, seja expressa ou implícita
MSDN Community Support
Por favor, lembre-se de Marcar como Resposta as respostas que resolveram o seu problema. Essa e uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.