none
Consolidar registros por data RRS feed

  • 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:

    1. Retornar dados de 1 a 31 do mês (Não necessariamente haverá registros de todos os dias do mês)
    2. Somar as colunas do tipo Hora de acordo com a data correspondente.
    3. 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

    quinta-feira, 6 de agosto de 2015 18:59

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
    quinta-feira, 6 de agosto de 2015 21:21

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.

    quinta-feira, 6 de agosto de 2015 19:40
  • 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

    quinta-feira, 6 de agosto de 2015 20:02
  • 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.

    quinta-feira, 6 de agosto de 2015 20:35
  • 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
    

    quinta-feira, 6 de agosto de 2015 21:00
  • 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
    quinta-feira, 6 de agosto de 2015 21:21
  • 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.

    quarta-feira, 12 de agosto de 2015 20:20