格式化报表的GroupBy结果

本文关键字:结果 GroupBy 报表 格式化 | 更新日期: 2023-09-27 18:20:35

我已经为此挣扎了几天。我创建了一个报告来衡量员工对客户的访问(也称为访问KPI)。

该报告实际上是有效的,但加载时间大约为10秒,这是我使用GroupBy语句解决的问题,而不是我定期创建的列表、查询、再次查询、另一组列表并序列化为JSON。

我需要做的很"简单"。我正在查询某一年的某个月(例如:2014年8月),但我需要检索之前2个月的信息,例如,我需要2014年8月份、2014年7月和2014年6月的数据。一列显示8月份的信息,第二列显示7月份的信息等等

  1. 用户1
    • 八月
      • 报告就诊次数:3次
      • 未报告的就诊次数:2次
    • 七月
      • 报告就诊次数:5次
      • 未报告的访问:3
    • 六月
      • 报告就诊次数:1次
      • 未报告就诊次数:6次
  2. 用户2
    • 八月
      • 报告就诊次数:3次
      • 未报告的就诊次数:2次
    • 六月
      • 报告就诊次数:1次
      • 未报告就诊次数:6次

等等…

好吧,我在这里还好,但我需要总是检索3个周期,例如,用户2没有7月份的信息,因为他当月没有进行任何访问。问题是,我需要JULY列的结果全部为零,以适应我的表/列布局(在HTML中)。类似这样的东西:

  1. 用户1
    • 八月
      • 报告就诊次数:3次
      • 未报告的就诊次数:2次
    • 七月
      • 报告就诊次数:5次
      • 未报告的访问:3
    • 六月
      • 报告就诊次数:1次
      • 未报告就诊次数:6次
  2. 用户2
    • 八月
      • 报告就诊次数:3次
      • 未报告的就诊次数:2次
    • 七月
      • 报告访问次数:0
      • 未报告的访问量:0
    • 六月
      • 报告就诊次数:1次
      • 未报告就诊次数:6次

我正在使用的LINQ语句:

var visitasGrouped = from visit in visits
                     group visit by visit.Author into visitsAuthor
                     orderby visitsAuthor.Key ascending
                     from visitsGroup in
                         (from visit in visitsAuthor
                          group visit by visit.DateScheduled.Month)
                     group visitsGroup by visitsAuthor.Key;

显然,count()部分是在foreach语句中计算的。

任何帮助都将不胜感激,包括改进LINQ语句、任何C#/LINQ魔法、使用Knockout或jQuery格式化接收到的JSON数组。一切。

谢谢你的回复。

格式化报表的GroupBy结果

这样做不需要编译器或任何测试,但这应该会让你走上正确的道路:

var months = Enumerable.Range(0, 2)
    .Select(x => endDate.AddMonths(-1*x).Month))
    .ToList();
var results = visits
    .GroupBy(v => v.Author)
        .SelectMany(v => months
            .Select(m =>
                new {
                    author = v.Key,
                    month = m,
                    reportedVisits = v.Count(v => v.Reported && v.DateScheduled.Month = m),
                    unreportedVisits = v.Count(v => v.Unreported && v.DateScheduled.Month = m),
                });

请注意,如果访问是一个大型数据集,这可能会效率低下,我不知道这是否会很好地转化为SQL。就像我说的,我的LINQ不太好。但它向你展示了原则:这几个月不会凭空而来,你需要自己具体说明。

对于SQL,加入一组月份,为每个用户提供一个可预测的基本结果,正如另一个答案所说。如果你想在得到输出后转换它,javascript和knockout应该很容易在这里使用:

// assuming your data looks like:
var data = {
    user1: { august: 10, july: 4 },
    user2: { august: 8, june: 3 }
};
// then generate some set of defaults like:
var defaults = { august: 0, july: 0, june: 0 };
// and do this to normalize each user:
Object.getOwnPropertyNames(data).map(function (user) {
    // assuming jquery, but replace with any object copying logic otherwise
    return $.extend({}, defaults, data[user]);
});