【问题标题】:Display Group by sum in new column在新列中按总和显示分组
【发布时间】:2021-03-19 06:50:40
【问题描述】:

我想在同一个数据表的新列中按总和显示分组。 例如:

我希望输出是这样的:

我试过如下:

  1. 按 sno 分组并存储在不同的表中。
  2. 通过使用 for 循环,我将总值分配给旧数据表。
for (int o = 0; o < returndata.Rows.Count;o++)
{
    for (int i = 0; i < table.Rows.Count;i++)
    {
        if(returndata.Rows[o]["sno"].ToString() == table.Rows[i]["sno"].ToString())
        {
            table.Rows[i]["total"] = returndata.Rows[o]["total"];
        }
    }
}

有没有其他方法可以使用 c# linq 直接分配 sum 值?

【问题讨论】:

    标签: c# datatable sum


    【解决方案1】:

    虽然这个问题被标记为 c#,并且在 c# 中有很多方法可以做到这一点,但我想强调的是,与编程语言相比,数据库更适合数据处理/转换。像这样的事情应该留给数据库,尤其是当数据量很大的时候。您所需要的只是修改查询以让数据库完成该部分。

    例如在 SQL Server 中,它应该是这样的:

    select sno, amount, total = sum(amount) over (partition by sno) from YourTable
    

    这将为您提供所需的准确信息,而不会减慢您的应用程序。

    在 OP 发表评论后编辑

    当无法更改查询时,在.NET 中进行更改的最简单方法是使用DataTable.Compute 方法。

    foreach (DataRow row in returndata.Rows)
    {
        row["total"] = returndata.Compute("sum(amount)", "sno=" + row["sno"].ToString());
    }
    

    【讨论】:

    • 是的,我同意您的观点,但我从 API 调用中获取数据并将其存储在数据表中。所以,我无法访问数据库。
    • @Bin,我刚刚更新了我的答案以显示编程方式。
    【解决方案2】:

    更新c#文件中的js代码,

    var obj = {}
    var dupdata = data.map(d => {
    obj[d.sno] = obj[d.sno] + l.amount
        return {...t, total: obj[d.sno]}
    })
    

    【讨论】:

      【解决方案3】:

      您可以在不使用其他数据表和 LINQ 的情况下实现此目的。
      请阅读代码里面的cmets:

      static void Example()
      {
          DataTable returndata = GetDataFromDb();
      
          // Get distinct sno for sum
          int[] distinct_sno = returndata.AsEnumerable().
              Select(x => x.Field<Int32>("sno")).Distinct().ToArray();
      
          foreach (var itm in distinct_sno)
          {
              // Sum all amount of each sno
              var sum = returndata.AsEnumerable().Where(x => x.Field<Int32>("sno") == itm).
                  Sum(x=>x.Field<Int32>("amount"));
              // Get all the rows that share the current sno
              var results = from myRow in returndata.AsEnumerable()
                            where myRow.Field<int>("sno") == itm
                            select myRow;
      
              // Add the sum for each total column of the current sno
              foreach (var row in results)
              {
                  row["total"] = sum;
              }
          }
      }
      

      【讨论】:

        【解决方案4】:

        如果你的 JSON 对象是这样的,

        let d = [
            {sno: 1, amount: 10},
            {sno: 1, amount: 20},
            {sno: 2, amount: 20},
            {sno: 2, amount: 20},
            {sno: 3, amount: 10},
            {sno: 3, amount: 15},
            {sno: 1, amount: 20},
            {sno: 3, amount: 6},
            {sno: 4, amount: 20},
            {sno: 4, amount: 19},
        ]
        
        let tableData = {}
        td = d.map(l => {
            if(!d[l.sno])
            d[l.sno] = 0
            d[l.sno] = d[l.sno] + l.amount
        })
        
        let td = d.map(t => {
            return {...t, total: tableData[t.sno]}
        })
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-11-23
          • 1970-01-01
          • 2013-07-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多