对于自定义表单的数据表格,常常要对其中的数据进行数据统计,
我们推荐将脚本放在保存后执行的脚本中进行计算
下面有三种方法可以选择
方法1,
统计出其中的数据列数,然后用循环语句合计数值
declare @eform_data table
(c_data xml)
insert into @eform_data(c_data)
values('<rows>
<row>
<c_tab>
<drows>
<drow>
<c_num>18000</c_num>
<c_num>1000000</c_num>
<c_num>18000</c_num>
</drow>
</drows>
</c_tab>
</row>
</rows>')
select * from @eform_data
declare @count varchar(20)
declare @sum money
declare @tsql nvarchar(1000)
declare @xmldata xml
set @sum = 0
select @count = cast(c_data.query('count(/rows/row/c_tab/drows/drow/c_num)') as varchar(20))
from @eform_data
select @count
select @xmldata = c_data.query('(/rows/row/c_tab/drows/drow/c_num)')
from @eform_data
while @count <> 0
begin
select @tsql = 'select @sum = @sum + @xmldata.value(''(/c_num)['+@count+']'',''money'')'
EXECUTE sp_executesql @tsql,N'@xmldata xml,@sum money out',@xmldata,@sum out
set @count = @COUNT - 1
end
select @sum
方法2,直接用xml做统计运算
declare @eform_data table
(c_data xml)
insert into @eform_data(c_data)
values('<rows>
<row>
<c_tab>
<drows>
<drow>
<c_num>18000</c_num>
<c_num>1000000</c_num>
<c_num>18000</c_num>
</drow>
</drows>
</c_tab>
</row>
</rows>')
select * from @eform_data
declare @sum money
select @sum= c_data.value('sum(/rows/row/c_tab/drows/drow/c_num)','money')
from @eform_data
select @sum
这个方法虽然语句简洁,但是存在一个问题,就是当数据合计超过百万的时候,数据结果会变成科学计数法
导致转换为money失败
方法3
查询出数据的xml,然后用字符串的运算计算合集
declare @eform_data table
(c_data xml)
insert into @eform_data(c_data)
values('<rows>
<row>
<c_tab>
<drows>
<drow>
<c_num>18000</c_num>
<c_num>1000000</c_num>
<c_num>18000</c_num>
</drow>
</drows>
</c_tab>
</row>
</rows>')
select * from @eform_data
declare @sql varchar(1000)
select @sql = cast(c_data.query('(/rows/row/c_tab/drows/drow/c_num)') as varchar(1000))
from @eform_data
select @sql
select sum(cast(replace(c_str,'c_num>','') as money) )
from dbo.uf_split_string(@sql,'')
where c_str not in ('','/c_num>','')
[此贴子已经被作者于2015/5/13 10:54:58编辑过]