Поскольку вам известно количество столбцов, вы можете сгруппировать данные по клиенту и продуктам, а затем взять условную сумму из группировки, и в результате будет получен другой столбец в результате запроса.
Пожалуйста, ознакомьтесь со следующей программой 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;}
}