2009-10-08 5 views
18

У меня есть таблица продуктов продаж, который выглядит следующим образом:Multiple группы по и Sum LINQ

saleDate  prod  qty 
10/22/09  soap  10 
09/22/09  pills  05 
09/25/09  soap  06 
09/25/09  pills  15 

мне нужно сделать SUM каждого месяца, так что финальный стол будет выглядеть следующим образом:

saleDate  prod  qty 
10/09  soap  10 
09/09  soap  06 
09/09  pills  20 

Могу ли я сделать это с помощью LINQ?

ответ

44
var products = new[] { 
    new {SaleDate = new DateTime(2009,10,22), Product = "Soap", Quantity = 10}, 
    new {SaleDate = new DateTime(2009,09,22), Product = "Pills", Quantity = 5}, 
    new {SaleDate = new DateTime(2009,09,25), Product = "Soap", Quantity = 6}, 
    new {SaleDate = new DateTime(2009,09,25), Product = "Pills", Quantity = 15} 
}; 

var summary = from p in products 
       let k = new 
       { 
        //try this if you need a date field 
        // p.SaleDate.Date.AddDays(-1 *p.SaleDate.Day - 1) 
        Month = p.SaleDate.ToString("MM/yy"), 
        Product = p.Product 
       } 
       group p by k into t 
       select new 
       { 
        Month = t.Key.Month, 
        Product = t.Key.Product, 
        Qty = t.Sum(p => p.Quantity) 
       }; 

foreach (var item in summary) 
    Console.WriteLine(item); 

//{ Month = 10/09, Product = Soap, Qty = 10 } 
//{ Month = 09/09, Product = Pills, Qty = 20 } 
//{ Month = 09/09, Product = Soap, Qty = 6 } 
+0

Wow, что было далеко мое понимание, если LINQ .... Постараюсь это то ответ .. спасибо – Luiscencio

+0

Если вы используете это против SQL, дайте мне знать, как это происходит. –

+0

он работал очень хорошо, просто пришлось изменить некоторые детали, я использую это против объекта datatabel, я попробую позже позже SQL ... thans = 3 – Luiscencio

2

Несомненно.

Это будет выглядеть следующим образом:

var GroupedSales = 
     from p in products 
     group p by p.saleDate.Month into g 
     select new { saleMonth = g.saleDate.Month, QtySold = g.Sum(p => p.qty) }; 

См: http://msdn.microsoft.com/en-us/vcsharp/aa336747.aspx#sumGrouped

Кроме того, обратите внимание, что я работал в предположении, что ваш набор данных был только данные 2009. Если вы хотите группировать по месяцам/годам, вы можете использовать saleDate.ToString («yyyyMM») вместо saleDate.Month.

+0

Вы можете также использовать (saleDate.Year * 12 + saleDate.Month) –

4
var q = from s in sales 
     group s by new {saleDate = s.saleDate.ToString("MM/yy"), s.prod} into g 
     select new { g.Key.saleDate, g.Key.prod, qty = g.Sum(s => s.qty) }; 
3
class Program 
{ 
    static void Main(string[] args) 
    { 
     var sales = new List<Sale>(); 
     sales.Add(new Sale() { Product = "soap", saleDate = new DateTime(2009, 10, 22), Quantity = 10}); 
     sales.Add(new Sale() { Product = "soap", saleDate = new DateTime(2009, 9,22), Quantity = 6}); 
     sales.Add(new Sale() { Product = "pills", saleDate = new DateTime(2009,9,25), Quantity = 15}); 
     sales.Add(new Sale() { Product = "pills", saleDate = new DateTime(2009,9,25), Quantity = 5}); 

     var q = from s in sales 
       group s by new { s.Product, s.saleDate.Month, s.saleDate.Year } into g 
       select new {Month = String.Format("{0:MM/yy}", new DateTime(g.Key.Year, g.Key.Month, 1)), product = g.Key.Product, quantity = g.Sum(o=>o.Quantity)}; 


    } 
} 

class Sale 
{ 
    public DateTime saleDate { get; set; } 
    public int Quantity { get; set; } 
    public string Product { get; set; } 
}