none
Retornando soma da semana em linq to sql RRS feed

  • Pergunta

  • Pessoal estou com uma dúvida, não sei se é possível, usando o Linq para selecionar os registro do banco, gostaria somar os valores por semana do mês.

    Exemplo: somar os valores das Datas de Segunda a Domingo

    É possível?


    Junior Santana


    • Editado Jr_inc segunda-feira, 29 de agosto de 2016 12:22
    segunda-feira, 29 de agosto de 2016 12:22

Respostas

  • Fiz um exemplo um pouco mais voltado ao seu caso. Segue o código:

            public class Registro
            {
                public DateTime Data { get; set; }
                public double Valor { get; set; }
    
                public Registro(DateTime data, double valor)
                {
                    this.Data = data;
                    this.Valor = valor;
                }
            }
    
            public void Executar()
            {
                List<Registro> regs = new List<Registro>
                {
                    new Registro(Convert.ToDateTime("27/08/2016"), 20.00),
                    new Registro(Convert.ToDateTime("29/08/2016"), 20.00),
                    new Registro(Convert.ToDateTime("28/08/2016"), 20.00),
                    new Registro(Convert.ToDateTime("31/08/2016"), 20.00),
                    new Registro(Convert.ToDateTime("04/08/2016"), 20.00),
                    new Registro(Convert.ToDateTime("11/08/2016"), 20.00)
                };
    
                var resultado = from x in regs.OrderBy(x => x.Data).GroupBy(x => CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(x.Data, CalendarWeekRule.FirstFullWeek, DayOfWeek.Sunday))
                        select new
                        {
                            primeiroDiaSemana = x.First().Data,
                            soma = x.Sum(y => y.Valor)
                        };
            }

    1) Criei uma classe Registro para simular a tabela do seu banco de dados

    2) Criei um método Executar para efeito de exemplo onde eu adiciono alguns itens a uma lista para poder fazer a consulta (Perceba que tem dados de semanas diferentes e alguns da mesma semana)

    3) Fiz a consulta linq onde eu ordeno a lista por data, em seguida separo em grupos semanais, a partir desses grupos eu realizo a soma.

    Debugue esse código e verá que na variavel "resultado" você terá os elementos separados por semana (contendo uma coluna para indicar o primeiro dia da semana que havia dados e outra coluna com a soma).

    Analise bem que certamente irá te ajudar.

    Valeu!


    Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!

    André Secco
    Microsoft MSP & MSDN Tech Advisor
    Blog: http://andresecco.com.br
    GitHub: http://github.com/andreluizsecco
    Twitter: @andre_secco

    segunda-feira, 29 de agosto de 2016 14:39

Todas as Respostas

  • Olá Jr,

    Sim é possível, não sei como está seu cenário aí, mas segue um exemplo utilizando expressão lambda para dar uma olhada na lógica:

    var soma = data.Where(x => x.Data >= dataInicial && x.Data <= dataFinal).Sum(x => x.Valor);

    Onde as variáveis "dataInicial" e "dataFinal" é o período que quer restringir a soma.

    Espero ter ajudado!

    Valeu!


    Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!

    André Secco
    Microsoft MSP & MSDN Tech Advisor
    Blog: http://andresecco.com.br
    GitHub: http://github.com/andreluizsecco
    Twitter: @andre_secco

    segunda-feira, 29 de agosto de 2016 13:15
  • Bom dia André, e bem parecido com isso.

    Vou tentar explicar.

    O vendedor recebe semanal, a soma será feita de Segunda a Domingo

    Então querem que eu pegue o mês 08 e traga um relatorio agrupando as 4 semana do mês

    Semana dia 01/08 á 07/08 = total

    Semana dia 08/08 á 14/08 = total

    Semana dia 15/08 á 21/08 = total

    Semana dia 22/08 á 28/08 = total

    ... e assim por diante


    Junior Santana

    segunda-feira, 29 de agosto de 2016 13:53
  • Fiz um exemplo um pouco mais voltado ao seu caso. Segue o código:

            public class Registro
            {
                public DateTime Data { get; set; }
                public double Valor { get; set; }
    
                public Registro(DateTime data, double valor)
                {
                    this.Data = data;
                    this.Valor = valor;
                }
            }
    
            public void Executar()
            {
                List<Registro> regs = new List<Registro>
                {
                    new Registro(Convert.ToDateTime("27/08/2016"), 20.00),
                    new Registro(Convert.ToDateTime("29/08/2016"), 20.00),
                    new Registro(Convert.ToDateTime("28/08/2016"), 20.00),
                    new Registro(Convert.ToDateTime("31/08/2016"), 20.00),
                    new Registro(Convert.ToDateTime("04/08/2016"), 20.00),
                    new Registro(Convert.ToDateTime("11/08/2016"), 20.00)
                };
    
                var resultado = from x in regs.OrderBy(x => x.Data).GroupBy(x => CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(x.Data, CalendarWeekRule.FirstFullWeek, DayOfWeek.Sunday))
                        select new
                        {
                            primeiroDiaSemana = x.First().Data,
                            soma = x.Sum(y => y.Valor)
                        };
            }

    1) Criei uma classe Registro para simular a tabela do seu banco de dados

    2) Criei um método Executar para efeito de exemplo onde eu adiciono alguns itens a uma lista para poder fazer a consulta (Perceba que tem dados de semanas diferentes e alguns da mesma semana)

    3) Fiz a consulta linq onde eu ordeno a lista por data, em seguida separo em grupos semanais, a partir desses grupos eu realizo a soma.

    Debugue esse código e verá que na variavel "resultado" você terá os elementos separados por semana (contendo uma coluna para indicar o primeiro dia da semana que havia dados e outra coluna com a soma).

    Analise bem que certamente irá te ajudar.

    Valeu!


    Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!

    André Secco
    Microsoft MSP & MSDN Tech Advisor
    Blog: http://andresecco.com.br
    GitHub: http://github.com/andreluizsecco
    Twitter: @andre_secco

    segunda-feira, 29 de agosto de 2016 14:39
  • André, vou tentar seguindo sua lógica e código. Valeuu!!!

    Junior Santana

    segunda-feira, 29 de agosto de 2016 15:34
  • Obrigado André, deu certo

    Junior Santana

    quinta-feira, 1 de setembro de 2016 15:12