格式化报表的GroupBy结果
本文关键字:结果 GroupBy 报表 格式化 | 更新日期: 2023-09-27 18:20:35
我已经为此挣扎了几天。我创建了一个报告来衡量员工对客户的访问(也称为访问KPI)。
该报告实际上是有效的,但加载时间大约为10秒,这是我使用GroupBy语句解决的问题,而不是我定期创建的列表、查询、再次查询、另一组列表并序列化为JSON。
我需要做的很"简单"。我正在查询某一年的某个月(例如:2014年8月),但我需要检索之前2个月的信息,例如,我需要2014年8月份、2014年7月和2014年6月的数据。一列显示8月份的信息,第二列显示7月份的信息等等
- 用户1
- 八月
- 报告就诊次数:3次
- 未报告的就诊次数:2次
- 七月
- 报告就诊次数:5次
- 未报告的访问:3
- 六月
- 报告就诊次数:1次
- 未报告就诊次数:6次
- 八月
- 用户2
- 八月
- 报告就诊次数:3次
- 未报告的就诊次数:2次
- 六月
- 报告就诊次数:1次
- 未报告就诊次数:6次
- 八月
等等…
好吧,我在这里还好,但我需要总是检索3个周期,例如,用户2没有7月份的信息,因为他当月没有进行任何访问。问题是,我需要JULY列的结果全部为零,以适应我的表/列布局(在HTML中)。类似这样的东西:
- 用户1
- 八月
- 报告就诊次数:3次
- 未报告的就诊次数:2次
- 七月
- 报告就诊次数:5次
- 未报告的访问:3
- 六月
- 报告就诊次数:1次
- 未报告就诊次数:6次
- 八月
- 用户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数组。一切。
谢谢你的回复。
这样做不需要编译器或任何测试,但这应该会让你走上正确的道路:
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]);
});