2012-07-02 68 views
2

表格式:是否可以选择列的总和,按另一列分组?

Date | NumberIWantToSum | ID(PK) | ForeignKeyID 

对于给定的ForeignKeyID,我想总结所有具有相同日期NumberIWantToSum值,使用LINQ2SQL,然后填充自己的自定义类的列表与所有从价值行。

这可能吗?

所以,给出的值:

Date | NumberIWantToSum | ID(PK) | ForeignKeyID 
    1/1/1    1     123    2 
    1/1/1    12     124    2 
    1/1/1    44     125    3 
    1/1/2    14     126    2 

我给出的参数ForeignKeyID此方法,让我们假定它是2,所以此方法应该返回行:

1/1/1    13     123    2 
    1/1/2    14     126    2 

我尝试要做到这一点:

(from o in context.table.Where(r => r.GroupByThisColID == GroupByThisColID) 
select new CustomClass() 
{ 
    ID = o.ID, 
    Date = o.Date, 
    NumberIWantToSum = o.NumberIWantToSum, 
    ForeignKeyID = o.ForeignKeyID 
}).ToList(); 

但是,这不会将NumberIWantToSum和梳子的值将它们分成一行。

我应该怎么做呢?

+0

ID字段 - 它包含在预期结果中,但不包含在组中(或MIN/MAX/etc)。那么如何选择123而不是124呢?有什么东西在那里失踪......? – Sean

+0

也许我错过了一些东西,但是不应该由2组产生1 + 12 + 14? –

+0

我不知道如何处理这个;这个列返回哪一个并不重要(因为两者都是唯一的)。有关如何处理这个问题的任何建议? –

回答

3

基于你的解释GroupByThisColdID是用来过滤,不群。你实际上想按日期分组。

试试这个:

var query = from o in context.table 
      where o.GroupByThisColID == GroupByThisColID 
      group o by o.Date into grouping 
      select new CustomClass() 
      { 
       ID = grouping.First().ID, 
       Date = grouping.Key, 
       SummedNumbers = grouping.Sum(g => g.NumberIWantToSum), 
       GroupByThisColID = grouping.First().GroupByThisColID 
      }; 

使用grouping.First().ID将返回第一个ID,虽然它们可能会有所不同。您的示例数据中将为“123”。

+0

完美!非常感谢,精彩的工作:) –

2
var r = from x in table 
     group x by x.GroupByThisColID into g 
     select new 
     { 
      Key = g.Key, 
      Sum = g.Sum(i => i.NumberIWantToSum) 
     }; 

foreach (var x in r) 
{ 
    var key = x.Key; 
    var sum = x.Sum; 
} 
2
var results = context.table.GroupBy(t=> t.GroupByThisColID) 
    .Select(g => new CustomClass() 
     { 
      GroupByThisColID = g.Key, 
      ColumnSum = g.Sum(p => p.NumberIWantToSum) 
     }); 
相关问题