我是java的新手。这个问题可能有答案,但我找不到答案。 我必须在java中创建一个方法,我必须从数据库中检索值,并且必须考虑那些在数据库中没有显示“OFF”的列值。然后必须计算这些值的平均值。现在我是查看数据库并手动考虑那些具有一些双值而不是“OFF”的列。但现在必须动态完成。 我有8列,其中我只需要3列,因为在其他列中没有值只有“OFF”显示,其平均值我能够计算。它的代码是
try {
con = getConnection();
String sql = "exec vcs_gauge @gauge_name=?,@first_rec_time=?,@last_rec_time=?";
clstmt = con.prepareCall(sql);
clstmt.setString(1, "vs3_bag");
clstmt.setString(2, "2014-09-01 10:00:00");
clstmt.setString(3, "2014-09-01 11:00:00");
clstmt.execute();
rs = clstmt.getResultSet();
while (rs.next()) {
a4 = rs.getDouble(7);
a5 = rs.getDouble(8);
a6 = rs.getDouble(10);
averageMap3.put(rs.getString(1), (a4 + a5 + a6) / 3.0);
}
//System.out.println("valus is" +averageList);
我现在想要的是,不是指定我想要的列,而是执行一个条件,检查是否有任何检索到的列具有字符串“OFF”值,然后不考虑进行平均计算。 我必须以行方式计算平均值,即计算一行中所有列的平均值。 提前谢谢
答案 0 :(得分:1)
你可以执行一个sql查询,选择一切接受值为" OFF" 或者您可以先选择可能具有“关闭”的列。价值并检查它是否有“关闭”和“关闭”。是否......如果没有,则继续进行计算。
编辑 - 示例:
while (rs.next()) {
ResultSetMetaData rsmd = rs.getMetaData();
boolean x = false;
for(int i = 0; i < rsmd.getColumnCount(); i++) {
if(rs.getString(i).equals("OFF")){
x = true;
}
}
if(x == false){
// edit to dynamically do an average....
double sum = 0;
int count = 0;
for(int i = 0; i < rsmd.getColumnCount(); i++) {
int type = rsmd.getColumnType(i);
if(type == Types.DOUBLE) {
sum = sum + rs.getDouble(i);
count ++;
}
}
averageMap3.put(rs.getString(1), (sum/count));
}
}
答案 1 :(得分:1)
您必须将构建平均值的步骤分解为多个步骤。例如:
while (rs.next()) {
double sum = 0;
int count = 0;
if (!"OFF".equals(rs.getString(7))) {
sum += rs.getDouble(7);
count += 1;
}
if (!"OFF".equals(rs.getString(8))) {
sum += rs.getDouble(8);
count += 1;
}
if (!"OFF".equals(rs.getString(10))) {
sum += rs.getDouble(10);
count += 1;
}
double average;
if (count > 0)
average = sum / count;
else
average = 0; // or whatever the result of all OFF means
averageMap3.put(rs.getString(1), average);
}
应该有更短的方法来实现同样的目标,但这是一个良好的开端。
e.g。同样的事情,但循环和使用?操作
while (rs.next()) {
double sum = 0;
int count = 0;
for (int column : new int[] { 7, 8, 10 }) {
if (!"OFF".equals(rs.getString(column))) {
sum += rs.getDouble(column);
count += 1;
}
}
double average = count > 0 ? sum / count : 0;
averageMap3.put(rs.getString(1), average);
}
答案 2 :(得分:0)
您正在阅读许多您不需要的数据,这会使其变得缓慢而复杂。一个更简单的解决方案就是满足您的需求。
String sql = "SELECT key, (col7 + col8 + col9)/3 FROM my_table" +
" WHERE on_off <> 'OFF' AND gauge_name=?" +
" AND first_rec_time>=? AND last_rec_time<=?";
如果必须使用此存储过程,可以将其放入临时表中并选择所需的结果。
这将只下载您需要的数据,密钥和平均值。