减去两个数据表值

Posted

技术标签:

【中文标题】减去两个数据表值【英文标题】:Substract two datatable values 【发布时间】:2019-09-12 05:26:15 【问题描述】:

我有 2 个具有相同架构的数据表。我想从 2 个数据表中减去这些值。 请注意,我使用数据透视查询从数据库中获取数据表。 我正在为我的问题寻找最佳解决方案。

例如我有以下数据表

Datatable 1
Date    Amount1 Amount2 Amount3
01/01/2019  45  21  21
02/01/2019  55  23  23
03/01/2019  458 3   23
04/01/2019  43  3   4
05/01/2019  534 45  67
06/01/2019  34  67  78
07/01/2019  45  7   56
08/01/2019  456 78  6

Datatable 2
Date    Amount1 Amount2 Amount3
01/01/2019  52  2   23
02/01/2019  65  3   23
03/01/2019  7   3   23
04/01/2019  52  2   3
05/01/2019  42  45  67
06/01/2019  54  3   78
07/01/2019  45  7   234
08/01/2019  54  3   24

我的预期输出应该是

Date    Amount1 Amount2 Amount3
01/01/2019  -7  19  -2
02/01/2019  -10 20  0
03/01/2019  451 0   0
04/01/2019  -9  1   1
05/01/2019  492 0   0
06/01/2019  -20 64  0
07/01/2019  0   0   -178
08/01/2019  402 75  -18

【问题讨论】:

【参考方案1】:
var result1 = (from c in dt.AsEnumerable()
                          join c2 in dt1.AsEnumerable() on c.Field<DataColumn>("Date") equals c2.Field<DataColumn>("Date")
                          select new
                          
                              Date = c.Field<DataColumn>("Date"),
                              Amount1 = Convert.ToInt32(c.Field<DataColumn>("Amount1")) - Convert.ToInt32(c2.Field<DataColumn>("Amount1")),
                              Amount2 = Convert.ToInt32(c.Field<DataColumn>("Amount2")) - Convert.ToInt32(c2.Field<DataColumn>("Amount2")),
                              Amount3 = Convert.ToInt32(c.Field<DataColumn>("Amount3")) - Convert.ToInt32(c2.Field<DataColumn>("Amount3")),
                          ).ToList();

转换成列表后。您需要将 List 转换为 DataTable。我正在编写将数据表转换为列表的代码。将此 result1 变量传递给 ToDataTable 方法

public static DataTable ToDataTable<T>(List<T> items)

        DataTable dataTable = new DataTable(typeof(T).Name);

       PropertyInfo[] Props = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);
        foreach (PropertyInfo prop in Props)
        

            var type = (prop.PropertyType.IsGenericType && prop.PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>) ? Nullable.GetUnderlyingType(prop.PropertyType) : prop.PropertyType);

            dataTable.Columns.Add(prop.Name, type);
        
        foreach (T item in items)
        
           var values = new object[Props.Length];
           for (int i = 0; i < Props.Length; i++)
           

                values[i] = Props[i].GetValue(item, null);
           
           dataTable.Rows.Add(values);
      

      return dataTable;

【讨论】:

【参考方案2】:

我附上了一张图片,我理解的是您想要减去的表格和最终结果。您是否考虑过在数据库上创建视图并仅查询结果的可能性?我在下面留下了一些 SQL 代码 (SQL Server 2012),您可以使用它们来取消透视源表、获取结果并再次透视表。您的源表是 p1 和 p2。 Data source

选择 TheDate,[dateamount1] 作为 Dateamount1,[dateamount2] 作为 Dateamount2,[dateamount3] 作为 Dateamount3 从 ( 选择 unP1.date 作为 TheDate,unp1.Concept 作为 TheConcept,unp1.orders-unp2.orders 作为 TheDiff FROM ( 选择日期、概念、订单 来自 (选择日期,dateamount1,dateamount2,dateamount3 FROM dbo.p1) 作为 P1u 取消透视 (Concept IN 订单 (dateamount1, dateamount2, dateamount3) )作为 uP1) 作为 unP1 内部联接 ( 选择日期、概念、订单 来自 (选择日期,dateamount1,dateamount2,dateamount3 FROM dbo.p2) 作为 P1u 取消透视 (Concept IN 订单 (dateamount1, dateamount2, dateamount3) )作为 uP2) 作为 unP2 ON unP1.date = unp2.date 和 unp1.Concept = unp2.Concept) p 枢 (总和(差异) FOR TheConcept in ([dateamount1], [dateamount2] , [dateamount3] ) ) 作为结果

希望对您有所帮助。

【讨论】:

以上是关于减去两个数据表值的主要内容,如果未能解决你的问题,请参考以下文章

如何从两个选择语句中减去值

减去前一个数据帧的当前值

用第一个值减去熊猫数据框中的一列

为啥减去两个本地 DateTime 值似乎不能说明夏令时?

在 Robot Framework 中减去两个 dict 值

使用两个数据帧计算最终值pandas