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
- La consulta une pedidos con un catálogo y agrupa por nombre de producto.
let revenuenombra la agregación que el ordenamiento reutiliza.- Los SKU sin pareja caen fuera del join y se cuentan al final.
Palabras clave y builtins usados aquí
bydescendingequalsforeachfromgroupinintojoinletnewonorderbyvar
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.
Paso 1 de 2 en Bis; paso 16 de 17 en LINQ a fondo.