C# 创建包含总计的按月数据表
我有两个数据库表,在下面的FK(ResponseHeader)示例中连接(示例中的日期是10月6日) 负责人C# 创建包含总计的按月数据表,c#,linq,C#,Linq,我有两个数据库表,在下面的FK(ResponseHeader)示例中连接(示例中的日期是10月6日) 负责人 ResponseHeaderId DateTime 0e24cf96-81eb-2122-7e4a-0d200474692f 06/10/2018 11:15:59 响应数据 ResponseDataId ResponseHeaderId
ResponseHeaderId DateTime
0e24cf96-81eb-2122-7e4a-0d200474692f 06/10/2018 11:15:59
响应数据
ResponseDataId ResponseHeaderId Response
41c831f1-0adc-2bd5-053e-00406fa526b6 0e24cf96-81eb-2122-7e4a-0d200474692f 1
78967068-82a6-4098-ba35-03211a923f46 0e24cf96-81eb-2122-7e4a-0d200474692f 2
854bc8a6-5877-a6fb-9072-00e358323350 0e24cf96-81eb-2122-7e4a-0d200474692f 2
fe2a667d-ca0e-49a6-b330-f4d4232bfe89 0e24cf96-81eb-2122-7e4a-0d200474692f 3
30f0270e-3e69-3408-7add-02a85f4b9aeb 0e24cf96-81eb-2122-7e4a-0d200474692f 1
有多个响应标头,每个响应标头有5行数据(每个)
需要将每组响应数据的响应相加(示例=9)
但我想要实现的是这样一个表,其中所有内容都是在给定年份内按月合计的
2018
Month Responses Sum
October 1 9
但是,由于每个响应负责人都有多行,因此我最终想要的是:
2018
Month Responses Sum
October 185 234
September 564 985
...
2017
Month Responses Sum
January 54 123
...
我有linq用于按月求和,例如:
var total = 0;
var filteredResponses = Model.SurveyResponseHeader.Where(x => x.StartDate > DateTime.Today.LastMonth() && x.StartDate > DateTime.Today.AddMonths(1).LastMonth()).ToList();
foreach (var response in filteredResponses)
{
var responseTotal = (response.SurveyResponses.Sum(x => x.Response));
total += responseTotal;
}
@total
考虑到这一切,我该怎么办
- 按月循环遍历数据,对当月的每个响应数据集求和
- 按月份和年份对数据进行分组
using System;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
using System.Text;
using System.Data;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
DataTable dt1 = new DataTable();
dt1.Columns.Add("ResponseHeaderId", typeof (string));
dt1.Columns.Add("DateTime", typeof (DateTime));
dt1.Rows.Add(new object[] { "0e24cf96-81eb-2122-7e4a-0d200474692f", DateTime.Parse("06/10/2018 11:15:59") });
dt1.Rows.Add(new object[] { "0e24cf96-81eb-2122-7e4a-0d2004746930", DateTime.Parse("05/10/2018 11:15:59") });
dt1.Rows.Add(new object[] { "0e24cf96-81eb-2122-7e4a-0d2004746931", DateTime.Parse("04/10/2018 11:15:59") });
dt1.Rows.Add(new object[] { "0e24cf96-81eb-2122-7e4a-0d2004746932", DateTime.Parse("03/10/2017 11:15:59") });
dt1.Rows.Add(new object[] { "0e24cf96-81eb-2122-7e4a-0d2004746933", DateTime.Parse("02/10/2017 11:15:59") });
DataTable dt2 = new DataTable();
dt2.Columns.Add("ResponseDataId", typeof (string));
dt2.Columns.Add("ResponseHeaderId", typeof (string));
dt2.Columns.Add("Response", typeof (int));
dt2.Rows.Add(new object[] { "41c831f1-0adc-2bd5-053e-00406fa526b6","0e24cf96-81eb-2122-7e4a-0d200474692f", 1 });
dt2.Rows.Add(new object[] { "78967068-82a6-4098-ba35-03211a923f46","0e24cf96-81eb-2122-7e4a-0d200474692f", 2 });
dt2.Rows.Add(new object[] { "854bc8a6-5877-a6fb-9072-00e358323350","0e24cf96-81eb-2122-7e4a-0d2004746930", 2 });
dt2.Rows.Add(new object[] { "fe2a667d-ca0e-49a6-b330-f4d4232bfe89","0e24cf96-81eb-2122-7e4a-0d2004746931", 3 });
dt2.Rows.Add(new object[] { "30f0270e-3e69-3408-7add-02a85f4b9aeb","0e24cf96-81eb-2122-7e4a-0d2004746932", 1 });
dt2.Rows.Add(new object[] { "30f0270e-3e69-3408-7add-02a85f4b9aeb","0e24cf96-81eb-2122-7e4a-0d2004746933", 1 });
var join = (from d1 in dt1.AsEnumerable()
join d2 in dt2.AsEnumerable() on d1.Field<string>("ResponseHeaderId") equals d2.Field<string>("ResponseHeaderId")
select new { d1 = d1, d2 = d2 })
.OrderByDescending(x => x.d1.Field<DateTime>("DateTime"))
.GroupBy(x => new { year = x.d1.Field<DateTime>("DateTime").Year, month = x.d1.Field<DateTime>("DateTime").ToString("MMMM") })
.Select(x => new { year = x.Key.year, month = x.Key.month, total = x.Select(y => y.d2.Field<int>("Response")).Sum()})
.ToList();
}
}
}
使用系统;
使用System.Collections.Generic;
使用系统集合;
使用System.Linq;
使用系统文本;
使用系统数据;
命名空间控制台应用程序1
{
班级计划
{
静态void Main(字符串[]参数)
{
DataTable dt1=新DataTable();
dt1.Columns.Add(“ResponseHeaderId”,typeof(string));
dt1.Columns.Add(“DateTime”,typeof(DateTime));
dt1.Rows.Add(新对象[]{“0e24cf96-81eb-2122-7e4a-0d200474692f”,DateTime.Parse(“06/10/2018 11:15:59”);
dt1.Rows.Add(新对象[]{“0e24cf96-81eb-2122-7e4a-0d2004746930”,DateTime.Parse(“05/10/2018 11:15:59”);
dt1.Rows.Add(新对象[]{“0e24cf96-81eb-2122-7e4a-0d2004746931”,DateTime.Parse(“04/10/2018 11:15:59”);
dt1.Rows.Add(新对象[]{“0e24cf96-81eb-2122-7e4a-0d2004746932”,DateTime.Parse(“03/10/2017 11:15:59”);
dt1.Rows.Add(新对象[]{“0e24cf96-81eb-2122-7e4a-0d2004746933”,DateTime.Parse(“02/10/2017 11:15:59”);
DataTable dt2=新的DataTable();
dt2.Columns.Add(“ResponseDataId”,typeof(string));
dt2.Columns.Add(“ResponseHeaderId”,typeof(string));
dt2.Columns.Add(“响应”,typeof(int));
添加(新对象[]{“41c831f1-0adc-2bd5-053e-00406fa526b6”,“0e24cf96-81eb-2122-7e4a-0d200474692f”,1});
添加(新对象[]{“78967068-82a6-4098-ba35-03211a923f46”,“0e24cf96-81eb-2122-7e4a-0d200474692f”,2});
添加(新对象[]{“854bc8a6-5877-a6fb-9072-00e358323350”,“0e24cf96-81eb-2122-7e4a-0d2004746930”,2});
添加(新对象[]{“fe2a667d-ca0e-49a6-b330-f4d4232bfe89”,“0e24cf96-81eb-2122-7e4a-0d2004746931”,3});
dt2.Rows.Add(新对象[]{“30f0270e-3e69-3408-7add-02a85f4b9aeb”,“0e24cf96-81eb-2122-7e4a-0d2004746932”,1});
dt2.Rows.Add(新对象[]{“30f0270e-3e69-3408-7add-02a85f4b9aeb”,“0e24cf96-81eb-2122-7e4a-0d2004746933”,1});
var join=(从dt1.AsEnumerable()中的d1开始)
在d1.Field(“ResponseHeaderId”)上的dt2.AsEnumerable()中加入d2等于d2.Field(“ResponseHeaderId”)
选择新的{d1=d1,d2=d2})
.OrderByDescending(x=>x.d1.Field(“日期时间”))
.GroupBy(x=>new{year=x.d1.Field(“DateTime”).year,month=x.d1.Field(“DateTime”).ToString(“MMMM”)})
.Select(x=>new{year=x.Key.year,month=x.Key.month,total=x.Select(y=>y.d2.Field(“Response”)).Sum())
.ToList();
}
}
}
我不确定这里的实际问题是什么。你说得很好,我实际上没有说。。。我不知道如何编写代码来生成这个输出。我试过了,但我解不出来。你的问题似乎太宽泛了。你能把注意力集中到你遇到麻烦的一个方面吗?例如,“我如何循环几个月?”或“我如何创建列?”非常感谢@jdweng对我的模型进行了一些调整,我已经得到了我所需要的。