Если вы разделите запрос на две отдельные группы: текущий месяц (или период времени) и предыдущий месяц (или период времени), им будет легче управлять. Для ясности я использую закрытый класс, чтобы сохранить интересующие нас результаты. Вместо этого вы можете использовать существующий класс. Или компилятор может даже быть достаточно умен, чтобы понять, что свойства идентичны и, следовательно, генерировать один и тот же анонимный класс для обоих запросов. В любом случае ...
private class C {
public object Key { get; set; }
public object Earnings { get; set; }
}
var thisMonth = (from m in db.Stats
where m.Item.AccountID == AccountID
&& m.DateTime.Month == month
group m by m.Item into g
select new C { g.Key, g.Earnings });
var lastMonth = (from m in db.Stats
where m.Item.AccountID == AccountID
&& m.DateTime.Month == month.AddMonths(-1)
group m by m.Item into g
select new C { g.Key, g.Earnings });
Отсюда вопрос объединения результатов для расчета процента прибыли или убытка между двумя наборами. Как только это будет сделано, вы можете отсортировать по максимальным значениям, чтобы получить ваш лучший номер.