TransWikia.com

Como fazer função JSON retornar Quantidade mensal de litros abastecidos no período de um ano

Stack Overflow em Português Asked by Cyberlacs on October 31, 2020

A função deve retornar este Exemplo: { “janeiro”: 500.00, “fevereiro”: 514.00, ….}

Minha tabela tem os seguintes campos.

Km do abastecimento
Litros Abastecidos
Valor Pago
Data do abastecimento

Desenvolvi uma instrução que consegue agrupar os meses, mas estou tendo dificuldades de fazer o somatório dos litros abastecidos em cada mês e o total de litros dentro de um ano.

    //GET: api/GetTotalLitrosPorAno/consulta=litros&ano=2020
    [HttpGet("GetTotalLitrosPorAno/{ano}")]
    public async Task<ActionResult<IEnumerable<Veiculo>>> GetTotalLitrosPorAno(string ano)
    {
        DateTime d = new DateTime(int.Parse(ano), 1, 1);

        var a = await _context.Veiculos
                         .Where(v => v.DataAbastecimento.Year == d.Year)
                         .GroupBy(x => new
                         {
                             Month = x.DataAbastecimento.Month
                         })
                         .ToListAsync();


        return Ok(a);

    }

Como posso realizar este procedimento ?

2 Answers

Você precisaria agrupar por data, ou mês direto e depois fazer um select em cima da lista gerada multiplicando o valor pela quantidade de litros.

Fiz uma aplicação console para ilustrar o seu caso, espero que ajude ou te dê uma luz, segue abaixo a DTO usada para simulação do seu banco:

public class Valores
    {
        public double ValorPago { get; set; }
        public DateTime DataAbastecimento { get; set; }
        public double QtdLitros { get; set; }
    }

e a classe program com o código.

class Program
    {
        static void Main(string[] args)
        {
            //carrega valores aleatórios
            List<Valores> valores = new List<Valores>() {
                new Valores { DataAbastecimento = new DateTime(2020,1,20), ValorPago = 3.00, QtdLitros = 20 },
                new Valores { DataAbastecimento = new DateTime(2020,1,20), ValorPago = 3.20, QtdLitros = 21 },
                new Valores { DataAbastecimento = new DateTime(2020,1,20), ValorPago = 3.40, QtdLitros = 23 },
                new Valores { DataAbastecimento = new DateTime(2020,2,20), ValorPago = 3.50, QtdLitros = 15 },
                new Valores { DataAbastecimento = new DateTime(2020,2,20), ValorPago = 3.00, QtdLitros = 30 },
                new Valores { DataAbastecimento = new DateTime(2020,3,20), ValorPago = 3.80, QtdLitros = 22 },
                new Valores { DataAbastecimento = new DateTime(2020,3,20), ValorPago = 3.45, QtdLitros = 27 },
                new Valores { DataAbastecimento = new DateTime(2020,5,20), ValorPago = 3.60, QtdLitros = 29 },
                new Valores { DataAbastecimento = new DateTime(2020,4,20), ValorPago = 3.70, QtdLitros = 18 },
                new Valores { DataAbastecimento = new DateTime(2020,6,20), ValorPago = 3.50, QtdLitros = 5 },
                new Valores { DataAbastecimento = new DateTime(2020,8,20), ValorPago = 3.80, QtdLitros = 45 },
                new Valores { DataAbastecimento = new DateTime(2020,9,20), ValorPago = 3.90, QtdLitros = 20 },
                new Valores { DataAbastecimento = new DateTime(2020,10,20), ValorPago = 3.50, QtdLitros = 30 },
                new Valores { DataAbastecimento = new DateTime(2020,11,20), ValorPago = 3.70, QtdLitros = 12 },
                new Valores { DataAbastecimento = new DateTime(2020,12,20), ValorPago = 3.80, QtdLitros = 18 },
                new Valores { DataAbastecimento = new DateTime(2020,3,20), ValorPago = 3.80, QtdLitros = 12 },
                new Valores { DataAbastecimento = new DateTime(2020,12,20), ValorPago = 3.85, QtdLitros = 45 },
                new Valores { DataAbastecimento = new DateTime(2020,11,20), ValorPago = 3.50, QtdLitros = 50 },
                new Valores { DataAbastecimento = new DateTime(2020,5,20), ValorPago = 3.60, QtdLitros = 40 },
                new Valores { DataAbastecimento = new DateTime(2020,7,20), ValorPago = 3.45, QtdLitros = 30 },
                new Valores { DataAbastecimento = new DateTime(2020,8,20), ValorPago = 3.10, QtdLitros = 12 },
                new Valores { DataAbastecimento = new DateTime(2020,6,20), ValorPago = 3.15, QtdLitros = 18 },
                new Valores { DataAbastecimento = new DateTime(2020,9,20), ValorPago = 3.30, QtdLitros = 16 },
                new Valores { DataAbastecimento = new DateTime(2020,10,20), ValorPago = 3.45, QtdLitros = 19 },
                new Valores { DataAbastecimento = new DateTime(2020,12,20), ValorPago = 3.78, QtdLitros = 12 },
                new Valores { DataAbastecimento = new DateTime(2020,11,20), ValorPago = 3.85, QtdLitros = 21 },
                new Valores { DataAbastecimento = new DateTime(2020,4,20), ValorPago = 3.98, QtdLitros = 24 },
                new Valores { DataAbastecimento = new DateTime(2020,11,20), ValorPago = 3.45, QtdLitros = 26 },
            };

            var valoresAgrupados = valores.Where(w => w.DataAbastecimento.Year == DateTime.Now.Date.Year)
                                    .GroupBy(g => g.DataAbastecimento.Month).Select(s => new { Month = s.Key, Valor = s.Sum(soma => soma.QtdLitros * soma.ValorPago)});

            foreach (var item in valoresAgrupados)
            {
                Console.WriteLine($"Mês: {item.Month} - valor: ${item.Valor}");
            }
        }
    }

Resultado esperado:

Mês: 1 - valor: $205,4
Mês: 2 - valor: $142,5
Mês: 3 - valor: $222,35
Mês: 5 - valor: $248,4
Mês: 4 - valor: $162,12
Mês: 6 - valor: $74,19999999999999
Mês: 8 - valor: $208,2
Mês: 9 - valor: $130,8
Mês: 10 - valor: $170,55
Mês: 11 - valor: $389,95
Mês: 12 - valor: $287,01
Mês: 7 - valor: $103,5

Correct answer by Lucas Souza on October 31, 2020

Consegui desenvolver uma solução que serviu perfeitamente em meu projeto, pode não estar correto mas funcionou e estou compartilhando.

        [HttpGet("GetTotalLitrosPorAno/{ano}")]
    public async Task<ActionResult<IEnumerable<Veiculo>>> GetTotalLitrosPorAno(string ano)
    {
        DateTime d = new DateTime(int.Parse(ano), 1, 1);

        //var ops = await _context.Veiculos.Where(v => v.DataAbastecimento.Year == d.Year).ToListAsync();
        ////var conta = (dynamic)null;
        //var conta = ops.Sum(v => v.Litros);

        List<Relatorio> lista = new List<Relatorio>();

        //AQUI GROUPBY FUNCIONA MAS NÃO CONSEGUI FAZER SOMATÓRIO DE CADA MÊS
        var eai = await _context.Veiculos
                         .Where(v => v.DataAbastecimento.Year == d.Year)
                         .GroupBy(x => new
                         {
                             Month = x.DataAbastecimento.Month
                         })
                         .ToListAsync(); 

        var mes = "";
        decimal valor = 0;
        foreach (var item in eai)
        {
            valor = 0;

            switch (item.Key.Month)
            {
                case 1:
                    mes = "Janeiro";
                    break;
                case 2:
                    mes = "Fevereiro";
                    break;
                case 3:
                    mes = "Março";
                    break;
                case 4:
                    mes = "Abril";
                    break;
                case 5:
                    mes = "Maio";
                    break;
                case 6:
                    mes = "Junho";
                    break;
                case 7:
                    mes = "Julho";
                    break;
                case 8:
                    mes = "Agosto";
                    break;
                case 9:
                    mes = "Setembro";
                    break;
                case 10:
                    mes = "Outubro";
                    break;
                case 11:
                    mes = "Novembro";
                    break;
                case 12:
                    mes = "Dezembro";
                    break;
                default:
                    mes = "Mês inexistente";
                    break;
            }

            foreach (var k in item)
            {
                valor = valor + k.Valor;
            }

            lista.Add(new Relatorio { Mes = mes, Valor = valor });
        }

        //string json = JsonConvert.SerializeObject(lista, Formatting.Indented);

        return Ok(lista);
        //return Ok(abcdefghijklmnopqrstuvxz);

    }

Esta função me retona o JSON da maneira que queria, trazendo o resultado planejado.

[
{
    "mes": "Janeiro",
    "valor": 300.00
},
{
    "mes": "Fevereiro",
    "valor": 200.00
},
{
    "mes": "Março",
    "valor": 400.00
},
{
    "mes": "Maio",
    "valor": 100.00
},
{
    "mes": "Junho",
    "valor": 200.00
},
{
    "mes": "Julho",
    "valor": 500.00
},
{
    "mes": "Agosto",
    "valor": 400.00
},
{
    "mes": "Outubro",
    "valor": 300.00
},
{
    "mes": "Novembro",
    "valor": 100.00
},
{
    "mes": "Dezembro",
    "valor": 300.00
}
]

Answered by Cyberlacs on October 31, 2020

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP