2016-10-30 4 views
0

Hey ich habe eine Linq-Abfrage, die ich keinen Sinn machen kann. Es bezieht sich auf eine Tabelle, um Verkaufsdaten für ein bestimmtes Unternehmen zu erhalten (Sammlung von Geschäften).Linq Abfrage mit mehreren GroupBy

Die Verkaufstabelle ist eine Sammlung von einzelnen Verkaufsartikeln, mehrere Verkaufsartikel können auf einer Rechnung sein. Ich muss eine Abfrage erstellen, die einen Tag im Wert von Verkäufen nach Geschäft sortiert und dann die gesamten Rechnungen für das Geschäft für diesen Tag zählt und die durchschnittliche Rechnung für dieses Geschäft für diesen Tag gibt. Hier

ist der Anfang von dem, was ich bisher

//get list of all stores bill count/average bill 

     FactSales.Where(d => d.DateKey >= 20130920).Where(d => d.DateKey <= 20130920) 
.Where(c => c.CompanyID == 4).GroupBy(g=>new{g.StoreID, g.BillID}).Select(g=>new{Store = g.Key.StoreID, Amount = g.Sum(a => a.Amount).Value }) 

Dies wird mir eine Liste aller einzelnen Rechnungen, aber wie bekomme ich den Durchschnitt und die Rechnung wird für jeden im Speicher in einer Liste, die enthalten würde: StoreID, Avg Bill (Summe aller Geschäftsrechnungen/Billcount) und Bill Count jedes Geschäftes?

Ich war in dieser Zeit und habe viele Beiträge gelesen und ich muss etwas sehr offensichtlich fehlen.

Jede Hilfe wird sehr geschätzt!

Antwort

1
FactSales 
    // filter sale positions by day 
    .Where(d => d.DateKey >= 20130920 && d.DateKey <= 20130920) 
    // filter sale positions by company 
    .Where(c => c.CompanyID == 4) 
    // group values by store and bill so each row will contains all sales in one bill 
    .GroupBy(g=>new { g.StoreID, g.BillID }) 
    // calculate total amount for each bill 
    .Select(g=>new { Store = g.Key.StoreID, Bill = g.Key.BillID, Amount = g.Sum(a => a.Amount).Value }) 
    // group bills by store so each row will contains all bills with total amount for this store 
    .GroupBy(g => g.Store) 
    // calculate bills count and avg amount for this store 
    .Select(g => new { Store = g.Key, Bills = g.Count(), AvgBill = g.Average(x => x.Amount) }); 

Ich Sache, dass g.Sum(a => a.Amount).Value sollte Value Eigenschaft nicht enthält und Sie können einfach g.Sum(a => a.Amount) tun.

+0

Dank Vadim war es eine sehr hilfreiche Antwort! – Nate58

0

i THK dies wird auch funktionieren:

var result = FactSales 
        .Where(d => d.DateKey >= 20130920 && d.DateKey <= 20130920) 
        .Where(c => c.CompanyID == 4) 
        .GroupBy(t => new { t.StoreId }) 
        .Select(X => new 
         { 
          Store = X.Key.StoreId, 
          Sum = X.Sum(t => t.Amount), 
          Bills = X.Count(), 
          average = X.Sum(t => t.Amount)/X.Count() 
         }); 

nicht.