我有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
答案 0 :(得分:0)
services.AddMvc(opt => {
var serviceProvider = services.BuildServiceProvider();
var modelStateJsonInputFormatter = new ModelStateJsonInputFormatter(
serviceProvider.GetRequiredService<ILoggerFactory>().CreateLogger<ModelStateJsonInputFormatter>(),
serviceProvider.GetRequiredService<IOptions<MvcJsonOptions>>().Value.SerializerSettings,
serviceProvider.GetRequiredService<ArrayPool<char>>(),
serviceProvider.GetRequiredService<ObjectPoolProvider>(),
opt,
serviceProvider.GetRequiredService<IOptions<MvcJsonOptions>>().Value
);
opt.InputFormatters.Insert(0, modelStateJsonInputFormatter);
}).SetCompatibilityVersion(Microsoft.AspNetCore.Mvc.CompatibilityVersion.Latest);
转换为列表后。您需要将List转换为DataTable。我正在编写将数据表转换为列表的代码。将此result1变量传递给ToDataTable方法
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();
答案 1 :(得分:0)
我已附上一张图片,了解您要减去的表格以及最终结果。您是否考虑过在数据库上创建视图并仅查询结果的可能性?我在下面留下了一些SQL代码(SQL Server 2012),可用于取消透视表,获取结果并再次透视表。您的源表是p1和p2。 Data source
SELECT TheDate,[dateamount1]作为Dateamount1,[dateamount2]作为Dateamount2,[dateamount3]作为Dateamount3
从
(
选择unP1.date作为TheDate,unp1.Concept作为TheConcept,unp1.orders-unp2.orders作为TheDiff FROM
(
选择日期,概念,订单
来自
(选择日期,日期量1,日期量2,日期量3
来自dbo.p1)作为P1u
UNPIVOT
(订购FOR Concept IN
(dateamount1,dateamount2,dateamount3)
)AS uP1)AS unP1
内部联接
(
选择日期,概念,订单
来自
(选择日期,日期量1,日期量2,日期量3
来自dbo.p2)作为P1u
UNPIVOT
(订购FOR Concept IN
(dateamount1,dateamount2,dateamount3)
)AS uP2)AS unP2
开启unP1.date = unp2.date和unp1.Concept = unp2.Concept)p
枢
(SUM(TheDiff)
对于中的概念
([dateamount1],[dateamount2],[dateamount3])作为结果
希望有帮助。