根据某个数值类型字段求和¶
本文档内容来源于 http://doc.myapps.cn/docs/common-script/common-script-1f1a40kaesagf
脚本说明¶
该脚本用于根据某个数值类型字段求和。在MyApps平台中,可以通过SQL的SUM函数或遍历记录来计算数值字段的总和。
常见实现方式¶
方式1:使用SQL SUM函数求和¶
(function(){
var domainId = getWebUser().getDomainid();
var sql = "SELECT SUM(item_数值字段) as total FROM tlk_表单名 WHERE domainid = '" + domainId + "'";
var result = findBySQL(sql);
if(result != null){
var sum = result.getItemValueAsDouble("total");
return sum != null ? sum : 0;
}
return 0;
})();
方式2:根据条件求和¶
(function(){
var condition = "条件值";
var domainId = getWebUser().getDomainid();
var sql = "SELECT SUM(item_数值字段) as total FROM tlk_表单名 WHERE item_条件字段 = '" + condition + "' AND domainid = '" + domainId + "'";
var result = findBySQL(sql);
if(result != null){
var sum = result.getItemValueAsDouble("total");
return sum != null ? sum : 0;
}
return 0;
})();
方式3:遍历记录求和¶
(function(){
var domainId = getWebUser().getDomainid();
var sql = "SELECT item_数值字段 FROM tlk_表单名 WHERE domainid = '" + domainId + "'";
var datas = queryBySQL(sql);
var sum = 0;
if(datas != null && datas.size() > 0){
for(var it = datas.iterator(); it.hasNext();){
var data = it.next();
var value = data.getItemValueAsDouble("数值字段");
if(value != null){
sum += value;
}
}
}
return sum;
})();
方式4:多个数值字段求和¶
(function(){
var domainId = getWebUser().getDomainid();
var sql = "SELECT SUM(item_字段1) as sum1, SUM(item_字段2) as sum2, SUM(item_字段3) as sum3 " +
"FROM tlk_表单名 WHERE domainid = '" + domainId + "'";
var result = findBySQL(sql);
if(result != null){
var sums = {
field1: result.getItemValueAsDouble("sum1") || 0,
field2: result.getItemValueAsDouble("sum2") || 0,
field3: result.getItemValueAsDouble("sum3") || 0
};
return JSON.stringify(sums);
}
return "{}";
})();
扩展示例¶
示例1:根据日期范围求和¶
(function(){
var startDate = "2024-01-01";
var endDate = "2024-12-31";
var domainId = getWebUser().getDomainid();
var sql = "SELECT SUM(item_金额字段) as total " +
"FROM tlk_表单名 " +
"WHERE item_日期字段 >= '" + startDate + "' " +
"AND item_日期字段 <= '" + endDate + "' " +
"AND domainid = '" + domainId + "'";
var result = findBySQL(sql);
if(result != null){
var sum = result.getItemValueAsDouble("total");
return sum != null ? sum : 0;
}
return 0;
})();
示例2:根据用户分组求和¶
(function(){
var domainId = getWebUser().getDomainid();
var sql = "SELECT item_用户字段, SUM(item_金额字段) as total " +
"FROM tlk_表单名 " +
"WHERE domainid = '" + domainId + "' " +
"GROUP BY item_用户字段";
var datas = queryBySQL(sql);
var sums = {};
if(datas != null && datas.size() > 0){
for(var it = datas.iterator(); it.hasNext();){
var data = it.next();
var userId = data.getItemValueAsString("用户字段");
var total = data.getItemValueAsDouble("total") || 0;
sums[userId] = total;
}
}
return JSON.stringify(sums);
})();
示例3:根据状态分类求和¶
(function(){
var domainId = getWebUser().getDomainid();
// 查询不同状态的金额总和
var sql = "SELECT item_状态字段, SUM(item_金额字段) as total " +
"FROM tlk_表单名 " +
"WHERE domainid = '" + domainId + "' " +
"GROUP BY item_状态字段";
var datas = queryBySQL(sql);
var sums = {};
if(datas != null && datas.size() > 0){
for(var it = datas.iterator(); it.hasNext();){
var data = it.next();
var status = data.getItemValueAsString("状态字段");
var total = data.getItemValueAsDouble("total") || 0;
sums[status] = total;
}
}
return JSON.stringify(sums);
})();
示例4:求和并格式化输出¶
(function(){
var domainId = getWebUser().getDomainid();
var sql = "SELECT SUM(item_金额字段) as total FROM tlk_表单名 WHERE domainid = '" + domainId + "'";
var result = findBySQL(sql);
if(result != null){
var sum = result.getItemValueAsDouble("total") || 0;
// 格式化金额(保留2位小数)
var formatted = sum.toFixed(2);
return "总金额: " + formatted;
}
return "总金额: 0.00";
})();
示例5:求和并计算平均值¶
(function(){
var domainId = getWebUser().getDomainid();
var sql = "SELECT SUM(item_数值字段) as total, COUNT(*) as count " +
"FROM tlk_表单名 WHERE domainid = '" + domainId + "'";
var result = findBySQL(sql);
if(result != null){
var sum = result.getItemValueAsDouble("total") || 0;
var count = result.getItemValueAsDouble("count") || 0;
var avg = count > 0 ? sum / count : 0;
var stats = {
sum: sum,
count: count,
average: avg
};
return JSON.stringify(stats);
}
return "{}";
})();
示例6:根据父文档求和子表数据¶
(function(){
var parentId = "父文档ID";
var sql = "SELECT SUM(item_金额字段) as total " +
"FROM tlk_子表名 " +
"WHERE parent = '" + parentId + "'";
var result = findBySQL(sql);
if(result != null){
var sum = result.getItemValueAsDouble("total");
return sum != null ? sum : 0;
}
return 0;
})();
示例7:求和并判断阈值¶
(function(){
var domainId = getWebUser().getDomainid();
var sql = "SELECT SUM(item_金额字段) as total FROM tlk_表单名 WHERE domainid = '" + domainId + "'";
var result = findBySQL(sql);
if(result != null){
var sum = result.getItemValueAsDouble("total") || 0;
var threshold = 10000; // 阈值
if(sum > threshold){
return "总金额: " + sum + " (超过阈值 " + threshold + ")";
}else{
return "总金额: " + sum + " (未超过阈值 " + threshold + ")";
}
}
return "总金额: 0";
})();
示例8:多条件求和¶
(function(){
var condition1 = "条件1";
var condition2 = "条件2";
var domainId = getWebUser().getDomainid();
var sql = "SELECT SUM(item_金额字段) as total " +
"FROM tlk_表单名 " +
"WHERE item_字段1 = '" + condition1 + "' " +
"AND item_字段2 = '" + condition2 + "' " +
"AND domainid = '" + domainId + "'";
var result = findBySQL(sql);
if(result != null){
var sum = result.getItemValueAsDouble("total");
return sum != null ? sum : 0;
}
return 0;
})();
示例9:求和并返回详细信息¶
(function(){
var domainId = getWebUser().getDomainid();
var sql = "SELECT SUM(item_金额字段) as total, COUNT(*) as count, " +
"MIN(item_金额字段) as min, MAX(item_金额字段) as max " +
"FROM tlk_表单名 WHERE domainid = '" + domainId + "'";
var result = findBySQL(sql);
if(result != null){
var stats = {
sum: result.getItemValueAsDouble("total") || 0,
count: result.getItemValueAsDouble("count") || 0,
min: result.getItemValueAsDouble("min") || 0,
max: result.getItemValueAsDouble("max") || 0
};
return JSON.stringify(stats);
}
return "{}";
})();
示例10:错误处理和日志记录¶
(function(){
var domainId = getWebUser().getDomainid();
try{
var sql = "SELECT SUM(item_金额字段) as total FROM tlk_表单名 WHERE domainid = '" + domainId + "'";
var result = findBySQL(sql);
if(result != null){
var sum = result.getItemValueAsDouble("total") || 0;
println("求和结果: " + sum);
return sum;
}else{
println("未找到数据");
return 0;
}
}catch(e){
println("错误: " + e.getMessage());
return 0;
}
})();
关键函数说明¶
findBySQL(sql): 执行SQL查询并返回单条记录queryBySQL(sql): 执行SQL查询并返回多条记录result.getItemValueAsDouble("字段名"): 获取数值类型字段值getWebUser().getDomainid(): 获取当前用户的域ID- SQL SUM函数:
SUM(字段名)用于计算字段总和
SQL SUM函数说明¶
基本语法¶
注意事项¶
- SUM函数会忽略NULL值
- 如果所有值都是NULL,SUM返回NULL
- 可以使用COALESCE或ISNULL处理NULL值
- 可以结合GROUP BY进行分组求和
注意事项¶
- ⚠️ NULL值处理: SUM函数会忽略NULL值,但结果可能为NULL,需要判断
- ⚠️ 数据类型: 确保字段是数值类型(int、double、decimal等)
- ⚠️ 域ID: 查询时建议加上域ID条件,避免跨域数据
- ⚠️ 性能优化: 使用SQL SUM比遍历记录更高效
- ⚠️ 精度问题: 注意数值精度,可能需要格式化输出
- 使用SQL SUM函数比遍历记录求和更高效
- 注意处理NULL值,避免计算错误
- 可以结合GROUP BY进行分组求和
使用场景¶
- 统计金额总和
- 计算数量总和
- 数据汇总分析
- 报表统计
- 业务指标计算
如需查看完整脚本代码,请访问源文档链接。