关于DataTable某一列等于这一列上面所有行的和,结帖率 100%

桌子旁边有个仙人掌 2012-08-29 06:26:04
DataTable某一列等于这一列上面所有行的和,任意一列都是这样,就是第三行第二列等于第一行第二列加上第二行第二列的和 第N行第二列等于第N-1行第二列加上第N-2行第二列的和


不知道有没有表达式,如果没有,只能程序里面相加了,感觉那样麻烦
...全文
215 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
其实11楼,翻译下来如下,linq

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
*/
  • 打赏
  • 举报
回复
很多事情不是 from tb 就能搞定的,有时候根本就没有tb,那就程序里面相加吧
杰拉尔 2012-08-29
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

引用 1 楼 的回复:

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


你怎么知道人家一定有……
[/Quote]


如果没有ID就没办法了吗??
with cte as(
select
rowNum=row_number() over (order by getdate())
,
num
from tb t
)
select
sumid=( select isnull(sum(num),0) from cte where rowNum<=t.rowNum)

from cte t
结果:
2
16
27
258
269

老龙友 2012-08-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

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
[/Quote]

你怎么知道人家一定有ID列?
你怎么知道人家的ID列一定是数字?
dalmeeme 2012-08-29
  • 打赏
  • 举报
回复
那不是一个循环就可以了?就2行代码:
		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"];


id sum
1 2
2 5
3 9
4 14
yanglei862587 2012-08-29
  • 打赏
  • 举报
回复
假定你的datatable 只存在一列,然后获得要计算到的行,我设定为第6行,这个你可以自行改变

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);
}
}
杰拉尔 2012-08-29
  • 打赏
  • 举报
回复
楼主看不懂我在讲清楚点

select * from tb t
结果:
ID NUM
1 2
2 14
3 11
4 231
5 11

语句2
select id,
num=( select isnull(sum(num),0) from tb where id<=t.id) from tb t

结果
id NUm
1 2
2 16
3 27
4 258
5 269
杰拉尔 2012-08-29
  • 打赏
  • 举报
回复
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


hwyqy 2012-08-29
  • 打赏
  • 举报
回复
感觉如果数据量少的话,自己写循环省事而且快
用SQL语句话,似乎有点难度,不大可能一条语句写完的,还是用游标之类
  • 打赏
  • 举报
回复
DataTable里面有个过滤规则是吧,我不知道怎么写,就是下面的是上面的所有和
  • 打赏
  • 举报
回复
id sum
1 2

2 3

3 4

4 5

现在加入DataTable里面是这些数据,我要变成这样

id sum
1 2

2 5

3 9

4 14
  • 打赏
  • 举报
回复
看不懂你什么意思 - - !
杰拉尔 2012-08-29
  • 打赏
  • 举报
回复
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

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧