2016-10-21 3 views
0

Ich habe eine Menge von Daten in das unten stehenden Format ..Top 5 eine Säule und Top-5 einer anderen Spalte für jede der ersten Spalte

var data1 = new[] { 
    new { Product = "Product 1", Year = 2009, Sales = 1212 }, 
    new { Product = "Product 2", Year = 2009, Sales = 522 }, 
    new { Product = "Product 1", Year = 2010, Sales = 1337 }, 
    new { Product = "Product 2", Year = 2011, Sales = 711 }, 
    new { Product = "Product 2", Year = 2012, Sales = 2245 }, 
    new { Product = "Product 3", Year = 2012, Sales = 1000 } 
}; 

Wenn ich die Top-20 Zeilen mit max Verkäufen erhalten wollte ich wie unten etwas tun könnte ..

data1.OrderByDescending(o=>o.Sales).Take(20); 

Aber was ich tun möchte, ist die Top-5-Produkte zu erhalten und (für diese Produkte) die Top-5 Jahre zusammen mit ihrem Vertrieb.

So würde die Ausgabe so etwas wie unten sein:

var outputdata = new[] { 
    new { Product = "Product 1", Year = 2012, Sales = 2245 }, 
    new { Product = "Product 1", Year = 2010, Sales = 1337 }, 
    new { Product = "Product 1", Year = 2009, Sales = 1212 }, 
    new { Product = "Product 1", Year = 2011, Sales = 711 }, 
    new { Product = "Product 1", Year = 2013, Sales = 522 }, 
    new { Product = "Product 2", Year = 2012, Sales = 1000 } 
}; 

This könnte eine ähnliche Frage für SQL sein. aber leider konnte ich nicht verstehen, wie man in linq umwandelt.

+0

Könnten Sie vielleicht ein Ausgabebeispiel zeigen? –

+0

Die Ausgabe würde die gleiche Struktur wie die Eingabe haben - {Product = "Product 1", Year = 2009, Sales = 1212}, wenn Ihre Frage etwas anderes ist, bitte erneut fragen, Danke – Arnab

+0

Ich meine, könnten Sie die gewünschte Ausgabe anhand eines Beispiels illustrieren ? –

Antwort

1

Ok, wenn ich richtig verstanden habe: Erste Gruppe von der product so können Sie von der gesamten sales eines Produkts bestellen. Dann können Sie nur die Menge nehmen, die Sie wollen. Verwenden Sie SelectMany, um die Gruppen abflachen:

var data = new[] { 
      new { Product = "Product 1", Year = 2009, Sales = 1212 }, 
      new { Product = "Product 2", Year = 2009, Sales = 522 }, 
      new { Product = "Product 1", Year = 2010, Sales = 1337 }, 
      new { Product = "Product 2", Year = 2011, Sales = 711 }, 
      new { Product = "Product 2", Year = 2012, Sales = 2245 }, 
      new { Product = "Product 3", Year = 2012, Sales = 1000 } 
     }; 
int numberOfProducts = 2; 
int numberOfYearsForEachProduct = 3; 

var result = data.GroupBy(x => x.Product) 
    .OrderByDescending(x => x.Sum(y => y.Sales)) //Order products by their total sum of `Sales` 
    .Take(numberOfProducts) 
    .SelectMany(x => x.OrderByDescending(y => y.Sales).Take(numberOfYearsForEachProduct)) // Take only the N top years for each product 
    .ToList(); 

ich kleinere Zahlen verwendet in der Take so kann ich sehen, dass sie es tut richtig

+0

Ja, ich wollte die nächste Bestellung auch auf den Umsatz .. – Arnab

+1

@Arnab - aktualisiert die Antwort. Freut mich, dass es dir geholfen hat –

0

Wenn ich Sie richtig erhalten Sie Top 20 Verkäufe erhalten möchten für die Top 5 Produkte.

var ord = data1.OrderByDescending(o => o.Sales) 
       .Select(o => o.Product) 
       .Distinct().Take(5);//Get top 5 products by their sales 

var salesForTopProducts = data1.OrderByDescending(o => o.Sales) 
           .Where(o => ord.Contains(o.Product)) 
           .Take(20);//Get top 20 sales for top 5 products 
1

Zunächst einmal sollten Sie die 20 am meisten verkauften Produkte

var top20Products = data1 
    .GroupBy(x => x.Product) 
    .OrderByDescending(group => group.Sum(x => x.Sales)) 
    .Select(group => group.Key) 
    .Take(20); 

und dann Top 5 meistverkauften Jahren von ihnen wählen

var top5yearsOfTop20products = top20Products 
    .SelectMany(product => data1 
     .Where(x => x.Product == product) 
     .OrderByDescending(x => x.Sales) 
     .Take(5)); 
Verwandte Themen