减去两个数据表值

时间:2019-09-12 05:26:15

标签: c# sql pivot

我有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

2 个答案:

答案 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])作为结果

希望有帮助。

相关问题