1.通过Javascript代码组件计算得到每个被评价人的每条评价的总分。 2.通过姓名进行排序 3.按照姓名进行分组统计,并分别得到他的各项专业能力的总分以及评价的个数 4.使用java表达式取平均分,并对平均值向上取整 最后表输出到mysql数据库中。用kettle操作
时间: 2024-12-18 18:29:19 浏览: 6
在Kettle(Pentaho Data Integration)工具中,你可以使用一系列步骤来完成这个任务:
1. **读取数据** (JDBC or CSV等): 首先,从数据库或者其他源读取包含评价信息的数据,包括评价人、评分、专业能力和评价详情。
```javascript
// 使用JavaScript读取数据示例 (假设表格名为ratings)
var data = db.query("SELECT * FROM ratings");
```
2. **计算总分** 和 **排序**:
- 对于每个评价人,使用循环遍历数据计算总分,并添加到一个新的字段。
- 使用 `ORDER BY` 子句按姓名进行排序。
```javascript
for(let i = 0; i < data.length; i++) {
let totalScore = data[i].score * data[i].evaluation_count;
// 更新当前行数据
data[i].total_score = totalScore;
}
data.sort((a, b) => a.name.localeCompare(b.name));
```
3. **分组统计**:
- 使用 `GROUP BY` 按姓名分组,然后计算每个姓名下各专业能力的总分和评价次数。
```javascript
var groupedData = data.reduce((acc, curr) => {
acc[curr.name] = { ...acc[curr.name], [curr.proficiency]: acc[curr.name][curr.proficiency] ? acc[curr.name][curr.proficiency] + curr.score : curr.score, evaluations: acc[curr.name].evaluations ? acc[curr.name].evaluations + curr.evaluation_count : curr.evaluation_count };
return acc;
}, {});
```
4. **计算平均分并向上取整**:
- 使用 `Math.ceil()` 函数将平均分向上取整。
```javascript
for (let person in groupedData) {
let averageScore = Math.ceil(groupedData[person].averageScore);
groupedData[person].averageScore = averageScore;
}
// averageScore = 总分 / 评价次数
where totalScore = groupedData[person].totalScore;
where evaluation_count = groupedData[person].evaluations;
```
5. **写入MySQL**:
- 创建一个SQL插入语句,然后使用Kettle的JDBC步骤将结果存入数据库。
```javascript
var insertSql = "INSERT INTO results (name, proficiency_total, evaluations, average_score) VALUES (?, ?, ?, ?)";
for (let person in groupedData) {
let values = [person, groupedData[person].proficiency_total, groupedData[person].evaluations, groupedData[person].averageScore];
connection.insert(insertSql, values);
}
```
6. **保存作业**:
最后,记得保存整个工作流作为作业,以便以后可以运行或调度。
阅读全文