tags:

views:

279

answers:

4

I have a products sales table that looks like this:

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

I need to make the SUM of each MONTH so the final table would look like this:

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

Can I do this with LINQ?

A: 

Sure.

It'll look like this:

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) };

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

Also, note that I was operating under the assumption that your dataset only had 2009 data. If you want to group by month/year, you can use saleDate.ToString("yyyyMM") instead of saleDate.Month.

Cam Soper
You can also use (saleDate.Year*12+saleDate.Month)
280Z28
+3  A: 
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 }
Matthew Whited
Wow that was way off my understanding if linq.... I'll try this then reply.. thanks
Luiscencio
If you are running this against SQL let me know how it goes.
Matthew Whited
it worked pretty well, just had to modify some details, I am using this against a datatabel object, I'll try it later agains SQL... thans =3
Luiscencio
+1  A: 
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) };
najmeddine
+1  A: 
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; }
}
Jason Punyon