c#从数据表中求和相同间隔、日期和类型的值

Posted

技术标签:

【中文标题】c#从数据表中求和相同间隔、日期和类型的值【英文标题】:c# Sum values of same interval and date and type from datatable 【发布时间】:2021-02-03 01:44:30 【问题描述】:

输入

我有一个DataTable,其结构如下(带有一些示例值):

输出

我想要一个像这样的DataTable 来保存计算结果:

变换逻辑

我想求和DateIntervalType 相同的值。

保存逻辑

    我想将结果复制到另一个DataTable。 我想将该副本保存到我在 SQL Server 中的主表中。

注意事项/要求

我想用 LINQ 来做这件事。 我不想为此在 SQL Server 中使用临时表。

我的代码(到目前为止)

var result = dt.AsEnumerable().GroupBy(row => new
    
        Date = row.Field<DateTime>("Date"),
        Interval = row.Field<DateTime>("Interval"),
        Type = row.Field<string>("Type")
    )
    .Select(a =>
    
        var row = a.First();
        row.SetField("Value", a.Sum(r => r.Field<double> "Value")));

        return row;
    );

var resultdt = result.CopyToDataTable();

【问题讨论】:

请出示您的代码。这样会更容易提供帮助。 我没有要展示的东西。我不知道如何语法,因为我需要按间隔、日期、类型对它们进行分组并获得相同间隔的总和。参数太多,我无法对其进行语法处理。我只能使用一个 group by 和一个简单的 where 来对表达式进行语法,而不是 this。这就是我寻求帮助的原因。 我在阅读了一些关于 linq 的其他主题后发布了一些代码。 @Kate10 您当前的解决方案有什么问题? 使用 GroubBy(x => Interval.Date :日期属性将日期截断到一天开始时的午夜,并从时间中删除小时、分钟、秒。 【参考方案1】:
using System;
using System.Data;
using System.Linq;

namespace ConsoleApp4

    class Program
    
        static void Main(string[] args)
        

            //Dummy data for demo purpose
            DataTable dt = new DataTable();
            dt.Columns.Add("Type");
            dt.Columns.Add("Date");
            dt.Columns.Add("Inverval");
            dt.Columns.Add("Value");

            dt.Rows.Add("one", "1/1/2020", 0.00, 11);
            dt.Rows.Add("one", "1/1/2020", 0.00, 1);
            dt.Rows.Add("one", "1/1/2020", 0.15, 1);
            dt.Rows.Add("two", "1/1/2020", 0.00, 6);
            dt.Rows.Add("two", "1/1/2020", 0.00, 2);
            dt.Rows.Add("two", "1/1/2020", 0.15, 4);


            var result = from tab in dt.AsEnumerable()
                         group tab by new
                         
                             Type = tab["Type"],
                             Date = tab["Date"],
                             Inverval = tab["Inverval"]
                         
                into groupDt
                         select new
                         
                             Type = groupDt.Key.Type,
                             Date = groupDt.Key.Date,
                             Inverval = groupDt.Key.Inverval,
                             Value= groupDt.Sum((r) => decimal.Parse(r["Value"].ToString()))
                         ;

        
    

【讨论】:

感谢您撰写本文。我会对其进行测试并回复您。 如何将结果复制到数据表中?【参考方案2】:

您需要使用 GroupBy。试试看:

myDataTable.AsEnumerable().GroupBy(x => x.Interval)

【讨论】:

是的,显然不仅仅是间隔。

以上是关于c#从数据表中求和相同间隔、日期和类型的值的主要内容,如果未能解决你的问题,请参考以下文章

c# SQL Server:日期时间数据类型

通过对两个日期之间的值求和来连接两个数据帧,sumif 等效

熊猫:将汇率查询乘以另一个数据框的相同日期后,按每日金额求和和汇总

解决从 datetime2 数据类型到 datetime 数据类型的转换产生一个超出范围的值的问题

(运行的干净代码)根据来自另一个数据帧的日期间隔和字符串条件获取一个数据帧中的值的平均值

C# 计算两个日期的时间间隔