423 3280228 -600 807 2004-9-9 12:53:43 董燕 2004
247 5515326 1000 1196 2004-9-1 16:48:35 董燕 2004
470 3181238 200 210 2004-9-12 16:25:41 宁莉 2036
452 3289169 -400 470 2004-9-11 11:18:50 宁莉 2036
299 3289894 200 229 2004-9-3 14:03:00 王玲 2105
300 3280420 200 244 2004-9-3 14:15:04 王玲 2105
如上表是在dbgrid 中显示出来的.我现在用 想统计合计输出如下:
董燕 1000 -600 400
宁莉 200 -400 -200
王玲 400 0 400
我的思路是:首先将 dbgrid1 中的 第一条记录中的 2004 赋予一个表达式 然后 从 dbgrid的第二条记录开始循环判断 如果相同则 继续加值 如果不同则 输出 看我的程序:
dbgrid1.DataSource.DataSet.RecNo:=0;
begin
ygname:=dbgrid1.DataSource.DataSet.Fields.Fields[6].AsString;
staffid:=dbgrid1.DataSource.DataSet.Fields.Fields[7].AsInteger;
end;//赋予初值
for j:=1 to dbgrid1.DataSource.DataSet.RecordCount-1 do
begin
if(staffid=dbgrid1.DataSource.DataSet.FieldByName('staff_id').AsInteger) then
begin
if( dbgrid1.DataSource.DataSet.FieldByName('change').AsInteger>0)then
begin ygchange1:=ygchange1+ dbgrid1.DataSource.DataSet.FieldByName('change').AsInteger;
end
else
begin ygchange2:=ygchange2+dbgrid1.DataSource.DataSet.FieldByName('change').AsInteger;
end;//以上是如果相同则 相应的 change 值 相加
end
else
begin
ygchange:=ygchange1+ygchange2;
strlist.Add(ygname+ #9 + IntToStr(ygchange1) + #9 + IntToStr(ygchange2) + #9 + IntToStr(ygchange));//这两句是 如果不同则先输出上面所有加的记录的值.也就是输出第一个staff_id 的合计数 ygname:=dbgrid1.DataSource.DataSet.Fields.Fields[6].AsString;
staffid:=dbgrid1.DataSource.DataSet.Fields.Fields[7].AsInteger;
if( dbgrid1.DataSource.DataSet.FieldByName('change').AsInteger>0)then
begin ygchange1:=dbgrid1.DataSource.DataSet.FieldByName('change').AsInteger;
end
else
begin ygchange2:=dbgrid1.DataSource.DataSet.FieldByName('change').AsInteger;
end;//重新赋予 新值
end; end;
ygchange:=ygchange1+ygchange2;
strlist.Add(ygname+ #9 + IntToStr(ygchange1) + #9 + IntToStr(ygchange2) + #9 + IntToStr(ygchange));//这两句是如果员工一直是同一个人.那么最后输出
大家帮我看看 为什么 我不能输出 所有的合计? 只能输出最后一名员工的 合计
247 5515326 1000 1196 2004-9-1 16:48:35 董燕 2004
470 3181238 200 210 2004-9-12 16:25:41 宁莉 2036
452 3289169 -400 470 2004-9-11 11:18:50 宁莉 2036
299 3289894 200 229 2004-9-3 14:03:00 王玲 2105
300 3280420 200 244 2004-9-3 14:15:04 王玲 2105
如上表是在dbgrid 中显示出来的.我现在用 想统计合计输出如下:
董燕 1000 -600 400
宁莉 200 -400 -200
王玲 400 0 400
我的思路是:首先将 dbgrid1 中的 第一条记录中的 2004 赋予一个表达式 然后 从 dbgrid的第二条记录开始循环判断 如果相同则 继续加值 如果不同则 输出 看我的程序:
dbgrid1.DataSource.DataSet.RecNo:=0;
begin
ygname:=dbgrid1.DataSource.DataSet.Fields.Fields[6].AsString;
staffid:=dbgrid1.DataSource.DataSet.Fields.Fields[7].AsInteger;
end;//赋予初值
for j:=1 to dbgrid1.DataSource.DataSet.RecordCount-1 do
begin
if(staffid=dbgrid1.DataSource.DataSet.FieldByName('staff_id').AsInteger) then
begin
if( dbgrid1.DataSource.DataSet.FieldByName('change').AsInteger>0)then
begin ygchange1:=ygchange1+ dbgrid1.DataSource.DataSet.FieldByName('change').AsInteger;
end
else
begin ygchange2:=ygchange2+dbgrid1.DataSource.DataSet.FieldByName('change').AsInteger;
end;//以上是如果相同则 相应的 change 值 相加
end
else
begin
ygchange:=ygchange1+ygchange2;
strlist.Add(ygname+ #9 + IntToStr(ygchange1) + #9 + IntToStr(ygchange2) + #9 + IntToStr(ygchange));//这两句是 如果不同则先输出上面所有加的记录的值.也就是输出第一个staff_id 的合计数 ygname:=dbgrid1.DataSource.DataSet.Fields.Fields[6].AsString;
staffid:=dbgrid1.DataSource.DataSet.Fields.Fields[7].AsInteger;
if( dbgrid1.DataSource.DataSet.FieldByName('change').AsInteger>0)then
begin ygchange1:=dbgrid1.DataSource.DataSet.FieldByName('change').AsInteger;
end
else
begin ygchange2:=dbgrid1.DataSource.DataSet.FieldByName('change').AsInteger;
end;//重新赋予 新值
end; end;
ygchange:=ygchange1+ygchange2;
strlist.Add(ygname+ #9 + IntToStr(ygchange1) + #9 + IntToStr(ygchange2) + #9 + IntToStr(ygchange));//这两句是如果员工一直是同一个人.那么最后输出
大家帮我看看 为什么 我不能输出 所有的合计? 只能输出最后一名员工的 合计
dbgrid1.DataSource.DataSet.findfirst 那样的话 是的记录回到 首位 .那样循环判断就不会出错了
你的循环差不多可以,你试试看
数据表:tt
字段 sid gain
---------------
数据
D001 1000
D001 -400
D002 200
D002 -400
D003 400
D003 0
查询结果
字段 sid gain1 gain2 …… sum
-----------------------------------
数据
D001 1000 -400 600
D002 200 -400 -200
D003 400 0 400
select sid,gain,gid=0 into #t from tt order by sid
declare @sid varchar(10),@i varchar(10),@s varchar(8000)
update #t set @i=case sid when @sid then @i+1 else 1 end
,gid=@i,@sid=sid
select @s='',@i=max(gid) from #t
while @i>0
select @s=',[gain'+@i+']=sum(case gid when '+@i+' then gain else 0 end)'+@s
,@i=@i-1
exec('select sid'+@s+',[sum]=sum(gain)
from #t group by sid')drop table #t