【问题标题】: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

【问题讨论】:

    标签: c# sql pivot


    【解决方案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] ) ) 作为结果

      希望对您有所帮助。

      【讨论】:

        猜你喜欢
        • 2016-07-28
        • 2017-04-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多