none
Acumulado Ano Atual e Ano Anterior RRS feed

  • Pergunta

  • Bom dia,

    Tenho um relatório no Reporting Services com um gráfico de barras, e eu preciso retornar o valor acumulado do Ano e também o acumulado do Ano anterior, por exemplo: Tenho a data no padrão Ano + Mês então caso eu entre com 201605 eu preciso retornar os valores de : 201601 + 201602 + 201603 + 201604 + 201605 eu consegui fazer, e está funcionando, usando essa condição no meu WHERE

    WHERE (AnoMes BETWEEN FLOOR(@AnoMes / 100) * 100 + 1 AND @AnoMes) )

    Eu preciso agora fazer retornar tbm os valores da data 201501 à 201505 que corresponde ao mesmo período do anterior.

    terça-feira, 17 de maio de 2016 12:45

Respostas

  • Olá twister8!

    Você precisará dar uma lida na cláusula OVER, ela é utilizada para esses cenários!

    https://msdn.microsoft.com/en-us/library/ms189461.aspx

    https://www.brentozar.com/sql-syntax-examples/window-function-examples-sql-server/

    Este é um exemplo de Total Acumulado:

    SELECT somedate, somevalue, 
    	SUM(somevalue) OVER(ORDER BY somedate ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS RunningTotal
    FROM Table

    Você avançado no estudo dessa funcionalidade, conseguirá comparar valores de períodos anteriores tranquilamente.

    Espero que atenda sua dúvida!


    Vithor da Silva e Silva | SQL Server Consultant and Trainer | vithor@vssti.com.br | Blog: http://www.vssti.com.br/blog ** Por favor, lembre-se de “Marcar como Resposta” as respostas que resolveram o seu problema. **

    quinta-feira, 9 de junho de 2016 20:16

Todas as Respostas

  • Você pode converter o campo de varchar para datetime e usar a cláusula between para listar os valores do intervalo. 
    O exemplo abaixo mostra como fazer a conversão:

    declare @data_inicial varchar(6) = '201601'
    declare @data_final varchar(6) = '201605'
    declare @data_convertida_inicial datetime = SUBSTRING(@data_inicial, 1, 4) + '-' + SUBSTRING (@data_inicial, 5, 6) + '-' + '01'
    declare @data_convertida_final datetime = SUBSTRING(@data_final, 1, 4) + '-' + SUBSTRING (@data_final, 5, 6) + '-' + '01'
    
    select 
    	@data_convertida_inicial as 'dataInicial',
    	@data_convertida_final as 'dataFinal'

    Sua query ficará algo como:

    select
    	*
    from suaTabela
    where
    	data between @data_convertida_inicial and @data_convertida_final



    terça-feira, 17 de maio de 2016 13:04
  • Obrigado por responder.

    Então só para eu entender, no caso meu SELECT tem uma váriavel AnoMes do tipo INT, então eu recebo o Ano + Mês, apenas 1 data, por exemplo 201605. Eu já fiz o acumulado dessa data, ou seja, usando a função floor foi possivel eu calcular o acumulado dessa data.

    O problema é a segunda parte, calcular o acumulado da Data anterior que nesse exemplo é de 201501 à 201505

    Com seu exemplo, não consegui fazer essa segunda parte, talvez eu não tenha entendido.

    terça-feira, 17 de maio de 2016 13:12
  • Deleted
    sexta-feira, 27 de maio de 2016 21:26
  • Olá twister8!

    Você precisará dar uma lida na cláusula OVER, ela é utilizada para esses cenários!

    https://msdn.microsoft.com/en-us/library/ms189461.aspx

    https://www.brentozar.com/sql-syntax-examples/window-function-examples-sql-server/

    Este é um exemplo de Total Acumulado:

    SELECT somedate, somevalue, 
    	SUM(somevalue) OVER(ORDER BY somedate ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS RunningTotal
    FROM Table

    Você avançado no estudo dessa funcionalidade, conseguirá comparar valores de períodos anteriores tranquilamente.

    Espero que atenda sua dúvida!


    Vithor da Silva e Silva | SQL Server Consultant and Trainer | vithor@vssti.com.br | Blog: http://www.vssti.com.br/blog ** Por favor, lembre-se de “Marcar como Resposta” as respostas que resolveram o seu problema. **

    quinta-feira, 9 de junho de 2016 20:16