Как сравнивать и суммировать значения нескольких периодов, используя LINQ в VB.Net - PullRequest
1 голос
/ 23 сентября 2011

У меня есть следующий пример данных:

Value1 Value2 Customer Product Date

100     50   1000     100     1.8.2010

50      20   1000     101     5.1.2010

200     60   1000     100     6.2.2011

180     100  1001     100     7.3.2010

500     700  1000     100     1.1.2010

300     300  1001     100     4.4.2011

250     600  1000     100     3.3.2011

И теперь пользователь должен иметь возможность сравнивать несколько периодов.В этом примере пользователь выбрал два периода: 1.1.2010 - 31.12.2010 и 1.1.2011 - 31.12.2011.Результат примера должен быть:

Customer Product SumValue1Period1 SumValue2Period1 SumValue1Period2 SumValue2Period2

1000 100 600 750 450 660

1000 101 50 20 0 0

1001 100 300 100 300 300

Как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 23 сентября 2011

Поскольку вам известно количество столбцов, вы можете сгруппировать данные по клиенту и продуктам, а затем взять условную сумму из группировки, и в результате будет получен другой столбец в результате запроса.

Пожалуйста, ознакомьтесь со следующей программой LinqPad. Извините, я не знаком с VB.Net, поэтому я кодировал его на C #, но вы поймете:

void Main()
{
    var Period1Start = new DateTime(2010,1,1);
    var Period1End = new DateTime(2010,12,31);
    var Period2Start = new DateTime(2011,1,1);
    var Period2End = new DateTime(2011,12,31);
    List<Item> lst = new List<Item>
    {
      new Item{ Value1 = 100, Value2 = 50, Customer = 1000, Product = 100 , Date = new DateTime(2010,8,1)},
      new Item{ Value1 = 50, Value2 = 20, Customer = 1000, Product = 101 , Date = new DateTime(2010,5,1)},
      new Item{ Value1 = 200, Value2 = 60, Customer = 1000, Product = 100 , Date = new DateTime(2011,2,6)},
      new Item{ Value1 = 180, Value2 = 100, Customer = 1001, Product = 100 , Date = new DateTime(2010,7,3)},    
      new Item{ Value1 = 500, Value2 = 700, Customer = 1000, Product = 100 , Date = new DateTime(2010,1,1)},
      new Item{ Value1 = 300, Value2 = 300, Customer = 1001, Product = 100 , Date = new DateTime(2011,4,4)},
      new Item{ Value1 = 250, Value2 = 600, Customer = 1000, Product = 100 , Date = new DateTime(2011,3,3)} 

    };

    var grp = lst.GroupBy(x=>new{x.Customer, x.Product}).
    Select(y=> new
    {
        Customer = y.Key.Customer,
        Product = y.Key.Product,
        SumValue1Period1 = y.Where(x=>x.Date >= Period1Start && x.Date<= Period1End).Sum(p=>p.Value1),
        SumValue2Period1 = y.Where(x=>x.Date >= Period1Start && x.Date<= Period1End).Sum(p=>p.Value2),
        SumValue1Period2 = y.Where(x=>x.Date >= Period2Start && x.Date<= Period2End).Sum(p=>p.Value1),
        SumValue2Period2 = y.Where(x=>x.Date >= Period2Start && x.Date<= Period2End).Sum(p=>p.Value2)

    });
    Console.WriteLine(grp);
}

// Define other methods and classes here
public class Item
{
    public int Value1{get;set;}
    public int Value2{get;set;}
    public int Customer{get;set;}
    public int Product{get;set;}
    public DateTime Date{get;set;}
}
0 голосов
/ 23 сентября 2011

Посмотрите на http://msdn.microsoft.com/en-us/vbasic/bb737908

В частности, пример ' GroupBy - Nested '. Это показывает использование LINQ для группировки по «заказам клиентов, сначала по годам, а затем по месяцам». Ваша ситуация должна быть более прямой, поскольку это всего лишь диапазон дат.

...