Multiple group by and Sum LINQ

后端 未结 4 1867
心在旅途
心在旅途 2020-12-29 07:02

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            


        
相关标签:
4条回答
  • 2020-12-29 07:14
    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) };
    
    0 讨论(0)
  • 2020-12-29 07:22
    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; }
    }
    
    0 讨论(0)
  • 2020-12-29 07:25

    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.

    0 讨论(0)
  • 2020-12-29 07:26
    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 讨论(0)
提交回复
热议问题