diff --git a/Elwig/Windows/DeliveryAdminWindow.xaml.cs b/Elwig/Windows/DeliveryAdminWindow.xaml.cs
index 2786790..114416d 100644
--- a/Elwig/Windows/DeliveryAdminWindow.xaml.cs
+++ b/Elwig/Windows/DeliveryAdminWindow.xaml.cs
@@ -599,59 +599,83 @@ namespace Elwig.Windows {
                     AddToolTipCell(StatusGradationToolTip, "⌀", 0, 3, 1, false, false, true);
                     AddToolTipCell(StatusGradationToolTip, "max.", 0, 4, 1, false, false, true);
                     AddGradationToolTipRow(1, "Gradation", null, kmwMin, kmwAvg, kmwMax);
-                } else {
-                    StatusGradation.Text = "Gradation: -";
-                }
 
-                if (n > 0 && (n <= 200 || TodayOnlyInput.IsChecked == true)) {
-                    var parts = await deliveryParts.ToListAsync();
-                    var attrGroups = parts
-                        .GroupBy(p => p.Attribute?.Name)
-                        .Select(g => (g.Key, g.Sum(p => p.Weight), g.Min(p => p.Kmw), Utils.AggregateDeliveryPartsKmw(g), g.Max(p => p.Kmw)))
-                        .OrderByDescending(g => g.Item2)
-                        .ThenBy(g => g.Key)
-                        .ToList();
-                    var groups = parts
-                        .GroupBy(p => (p.Attribute?.Name, p.SortId))
-                        .Select(g => (g.Key.Name, g.Key.SortId, g.Sum(p => p.Weight), g.Min(p => p.Kmw), Utils.AggregateDeliveryPartsKmw(g), g.Max(p => p.Kmw)))
-                        .OrderByDescending(g => g.SortId)
-                        .ThenBy(g => g.Name)
+                    var attrGroups = await deliveryParts
+                        .GroupBy(p => p.Attribute.Name)
+                        .Select(g => new {
+                            Attr = g.Key,
+                            Weight = g.Sum(p => p.Weight),
+                            Min = g.Min(p => p.Kmw),
+                            Avg = g.Sum(p => p.Kmw * p.Weight) / g.Sum(p => p.Weight),
+                            Max = g.Max(p => p.Kmw),
+                        })
+                        .OrderByDescending(g => g.Weight)
+                        .ThenBy(g => g.Attr)
+                        .ToListAsync();
+                    var sortGroups = await deliveryParts
+                        .GroupBy(p => p.SortId)
+                        .Select(g => new {
+                            SortId = g.Key,
+                            Weight = g.Sum(p => p.Weight),
+                            Min = g.Min(p => p.Kmw),
+                            Avg = g.Sum(p => p.Kmw * p.Weight) / g.Sum(p => p.Weight),
+                            Max = g.Max(p => p.Kmw),
+                        })
+                        .OrderByDescending(g => g.Weight)
                         .ThenBy(g => g.SortId)
-                        .ToList();
+                        .ToListAsync();
+                    var groups = await deliveryParts
+                        .GroupBy(p => new {
+                            p.Attribute.Name,
+                            p.SortId,
+                        })
+                        .Select(g => new {
+                            Attr = g.Key.Name,
+                            g.Key.SortId,
+                            Weight = g.Sum(p => p.Weight),
+                            Min = g.Min(p => p.Kmw),
+                            Avg = g.Sum(p => p.Kmw * p.Weight) / g.Sum(p => p.Weight),
+                            Max = g.Max(p => p.Kmw)
+                        })
+                        .OrderByDescending(g => g.SortId)
+                        .ThenBy(g => g.Attr)
+                        .ThenBy(g => g.SortId)
+                        .ToListAsync();
 
                     int rowNum = 1;
                     foreach (var attrG in attrGroups) {
                         rowNum++;
-                        AddWeightToolTipRow(rowNum++, attrG.Key, null, attrG.Item2, attrG.Item2, weight);
-                        AddGradationToolTipRow(rowNum, attrG.Key, null, attrG.Item3, attrG.Item4, attrG.Item5);
-                        foreach (var g in groups.Where(g => g.Name == attrG.Key).OrderByDescending(g => g.Item3).ThenBy(g => g.SortId)) {
-                            AddWeightToolTipRow(rowNum++, null, g.SortId, g.Item3, attrG.Item2, weight);
-                            AddGradationToolTipRow(rowNum, null, g.SortId, g.Item4, g.Item5, g.Item6);
+                        AddWeightToolTipRow(rowNum++, attrG.Attr, null, attrG.Weight, attrG.Weight, weight);
+                        foreach (var g in groups.Where(g => g.Attr == attrG.Attr).OrderByDescending(g => g.Weight).ThenBy(g => g.SortId)) {
+                            AddWeightToolTipRow(rowNum++, null, g.SortId, g.Weight, attrG.Weight, weight);
+                        }
+                    }
+                    rowNum = 2;
+                    foreach (var attrG in attrGroups) {
+                        rowNum++;
+                        AddGradationToolTipRow(rowNum++, attrG.Attr, null, attrG.Min, attrG.Avg, attrG.Max);
+                        foreach (var g in groups.Where(g => g.Attr == attrG.Attr).OrderByDescending(g => g.Avg).ThenBy(g => g.SortId)) {
+                            AddGradationToolTipRow(rowNum++, null, g.SortId, g.Min, g.Avg, g.Max);
                         }
                     }
 
                     if (attrGroups.Count == 1) {
-                        var g = attrGroups.First().Key;
+                        var g = attrGroups.First().Attr;
                         if (g != null) {
                             StatusWeight.Text += $" [{g}]";
                             StatusGradation.Text += $" [{g}]";
                         }
-
-                        var sortGroups = parts
-                            .GroupBy(p => p.SortId)
-                            .Select(g => (g.Key, g.Sum(p => p.Weight), g.Min(p => p.Kmw), Utils.AggregateDeliveryPartsKmw(g), g.Max(p => p.Kmw)))
-                            .OrderByDescending(g => g.Item2)
-                            .ToList();
-
                         if (sortGroups.Count > 1 && sortGroups.Count <= 4) {
-                            StatusWeight.Text += $" = {string.Join(" + ", sortGroups.Select(g => $"{g.Item2:N0} kg ({(double)g.Item2 / weight:0%})" + (g.Key == null ? "" : $" [{g.Key}]")))}";
-                            StatusGradation.Text += $" = {string.Join(" + ", sortGroups.Select(g => $"{g.Item3:N1}/{g.Item4:N1}/{g.Item5:N1}" + (g.Key == null ? "" : $" [{g.Key}]")))}";
+                            StatusWeight.Text += $" = {string.Join(" + ", sortGroups.Select(g => $"{g.Weight:N0} kg ({(double)g.Weight / weight:0%})" + (g.SortId == null ? "" : $" [{g.SortId}]")))}";
+                            StatusGradation.Text += $" = {string.Join(" + ", sortGroups.Select(g => $"{g.Min:N1}/{g.Avg:N1}/{g.Max:N1}" + (g.SortId == null ? "" : $" [{g.SortId}]")))}";
 
                         }
                     } else if (attrGroups.Count <= 4) {
-                        StatusWeight.Text += $" = {string.Join(" + ", attrGroups.Select(g => $"{g.Item2:N0} kg ({(double)g.Item2 / weight:0%})" + (g.Key == null ? "" : $" [{g.Key}]")))}";
-                        StatusGradation.Text += $" = {string.Join(" + ", attrGroups.Select(g => $"{g.Item3:N1}/{g.Item4:N1}/{g.Item5:N1}" + (g.Key == null ? "" : $" [{g.Key}]")))}";
+                        StatusWeight.Text += $" = {string.Join(" + ", attrGroups.Select(g => $"{g.Weight:N0} kg ({(double)g.Weight / weight:0%})" + (g.Attr == null ? "" : $" [{g.Attr}]")))}";
+                        StatusGradation.Text += $" = {string.Join(" + ", attrGroups.Select(g => $"{g.Min:N1}/{g.Avg:N1}/{g.Max:N1}" + (g.Attr == null ? "" : $" [{g.Attr}]")))}";
                     }
+                } else {
+                    StatusGradation.Text = "Gradation: -";
                 }
             } else {
                 StatusVarieties.Text = "Sorten: -";