日期:2014-05-17  浏览次数:20516 次

关于DataTable某一列等于这一列上面所有行的和,结帖率 100%
DataTable某一列等于这一列上面所有行的和,任意一列都是这样,就是第三行第二列等于第一行第二列加上第二行第二列的和 第N行第二列等于第N-1行第二列加上第N-2行第二列的和


不知道有没有表达式,如果没有,只能程序里面相加了,感觉那样麻烦

------解决方案--------------------
select *,
sumnum=( select isnull(sum(num),0) from tb where id<=t.id)

 from tb t


sumnum是num的求和 结果如下:
id num sumnum
1 2 2
2 14 16
3 11 27
4 231 258
5 11 269



------解决方案--------------------
假定你的datatable 只存在一列,然后获得要计算到的行,我设定为第6行,这个你可以自行改变
C# code

public static DataTable GetTable(DataTable dt)
        {
            DataRow dataRow = dt.NewRow();
            int result = 0;
            foreach (DataRow row in dt.Rows)
            {
                result += int.Parse(row["number"].ToString());
            }
            dataRow["number"] = result;
            dt.Rows.Add(dataRow);
            if (dt.Rows.Count == 6)
            {
                return dt;
            }
            else
            {
                return GetTable(dt);
            }
        }

------解决方案--------------------
那不是一个循环就可以了?就2行代码:
C# code
        DataTable dt = new DataTable();
        dt.Columns.Add("id", typeof(int));
        dt.Columns.Add("sum", typeof(int));
        dt.Rows.Add(1, 2);
        dt.Rows.Add(2, 3);
        dt.Rows.Add(3, 4);
        dt.Rows.Add(4, 5);

        for (int i = 1; i < dt.Rows.Count; i++)
            dt.Rows[i]["sum"] = (int)dt.Rows[i - 1]["sum"] + (int)dt.Rows[i]["sum"];

------解决方案--------------------
探讨

select *,
sumid=( select isnull(sum(num),0) from tb where id<t.id)

from tb t


SQL查义时绑定好不是更好
id num sumid
1 2 0
2 14 2
3 11 16
4 231 27
5 11 258

------解决方案--------------------
http://msdn.microsoft.com/zh-cn/library/system.data.datacolumn.expression(v=vs.80).aspx
------解决方案--------------------
其实11楼,翻译下来如下,linq
C# code

DataTable dt = new DataTable();
            dt.Columns.Add("id", typeof(int));
            dt.Columns.Add("sum", typeof(int));
            dt.Rows.Add(1, 2);
            dt.Rows.Add(2, 3);
            dt.Rows.Add(3, 4);
            dt.Rows.Add(4, 5);
            dt = dt.AsEnumerable().Select(a =>
            {
                DataRow dr = dt.NewRow();
                object o = dt.Compute("sum(sum)", "id<=" + a.Field<int>("id"));
                int sum=0;
                int.TryParse(o.ToString(),out sum);
                dr["id"] = a.Field<int>("id");
                dr["sum"] = sum;
                return dr;
            }).CopyToDataTable<DataRow>();
            //此时 DataTable数据如下
            /*
             id sum 
              1 2

            2 5

            3 9

            4 14
             */