typestar

sales_report.cs en C#

Unir, agrupar y clasificar en una consulta: una tabla de ventas desde pedidos crudos.

// sales_report: une pedidos con un catálogo, agrupa y clasifica lo recaudado
var catalog = new[]
{
    (Sku: "kb-01", Name: "Keyboard", Price: 89.00),
    (Sku: "ms-02", Name: "Mouse", Price: 49.00),
    (Sku: "mn-03", Name: "Monitor", Price: 349.00),
};
var orders = new[]
{
    (Sku: "kb-01", Qty: 3), (Sku: "mn-03", Qty: 1),
    (Sku: "kb-01", Qty: 2), (Sku: "ms-02", Qty: 4),
    (Sku: "mn-03", Qty: 2), (Sku: "xx-99", Qty: 1),
};

var rows = (
    from o in orders
    join item in catalog on o.Sku equals item.Sku
    group (o, item) by item.Name into g
    let revenue = g.Sum(x => x.o.Qty * x.item.Price)
    orderby revenue descending
    select (Product: g.Key, Units: g.Sum(x => x.o.Qty), Revenue: revenue))
    .ToList();

Console.WriteLine("product    units  revenue");
foreach (var (product, units, revenue) in rows)
{
    Console.WriteLine($"{product,-9} {units,5}  {revenue,8:F2}");
}

var matched = rows.Sum(r => r.Units);
var total = orders.Sum(o => o.Qty);
Console.WriteLine($"\n{total - matched} units had no catalog entry");

Cómo funciona

  1. La consulta une pedidos con un catálogo y agrupa por nombre de producto.
  2. let revenue nombra la agregación que el ordenamiento reutiliza.
  3. Los SKU sin pareja caen fuera del join y se cuentan al final.

Palabras clave y builtins usados aquí

El intento, en números

Líneas
32
Caracteres a escribir
990
Tokens
274
Ritmo de tres estrellas
90 tpm

Al ritmo de tres estrellas de 90 tokens por minuto, este intento toma unos 183 segundos.

Escribe este fragmento

Paso 1 de 2 en Bis; paso 16 de 17 en LINQ a fondo.

← Anterior Siguiente →