减去两个数据表值
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] ) ) 作为结果
希望对您有所帮助。
【讨论】:
以上是关于减去两个数据表值的主要内容,如果未能解决你的问题,请参考以下文章