如何通过SQL中某些表的字段的平均值来排序列

时间:2012-03-31 21:48:20

标签: sql average

我认为要理解我需要阅读的标题并不容易,所以我会更好地解释。 我的数据库就像:

表1 Table1表2 Table2表3 Table3和其他类似的表......

用户将在文本字段中插入1之类的值,我只会向其显示包含1的名称。我是这样做的:

ArrayList<String> found = new ArrayList<String>();
ArrayList<String> allTable = getAllTableInDB();

for(String table:allTable){
    try {
        ResultSet rs = stat.executeQuery("SELECT * FROM '"+table+"'");
        while(rs.next()){
            if(!found.contains(rs.getString("name")) && rs.getString("name").equals(WhatUserInserts))
                found.add(rs.getString("name"));
        }
    } catch (SQLException ex) {
        ex.printStackTrace();
            Logger.getLogger(DB.class.getName()).log(Level.SEVERE, null, ex);
    }
}

我现在要做的是计算此名称的“最佳”,按列v的平均值排序。

对于一张桌子,我知道我可以使用类似的东西:

SELECT name FROM table GROUP BY name ORDER BY AVG(v) DESC

如何在某些表的这个限制值上做同样的事情?

我希望我能很好地解释我的问题

以这种方式解决了感谢Dan P

ArrayList<String> tables = getAllTableInDB();
String query = "SELECT * FROM (";
String union = " UNION ";

for(int i=0;i<tables.size();i++){
    query+="SELECT * FROM '"+tables.get(i)+"' WHERE name LIKE '%"+find+"%'";
    query = i==tables.size()-1?query:query+union;
}

query+=") GROUP BY nome ORDER BY AVG(venduti) DESC";

1 个答案:

答案 0 :(得分:2)

假设您想要所有表的Max或Avg,这将获得name的最大V值。如果你想要Avgerage使用AVG。我并不完全理解这个问题,但我认为这就是你想要的。

SELECT Name, Max(V)
FROM
(
  SELECT Name, v
  FROM TABLE1
  UNION
  SELECT Name, v
  FROM TABLE2
  UNION
  SELECT Name, v
  FROM TABLE3
) AS AllTables
GROUP BY Name
WHERE Name = 'Jon Doe'

评论后,您询问是否可以提高效果。是的,假设名称上有索引/主键,将名称包含在每个表的where子句中。如果你走这条路,你应该使用一个表值函数。

DECLARE @Name NVARCHAR(50)
SET @Name = 'Jon Doe' 

SELECT Name, Max(V)
FROM
(
  SELECT Name, v
  FROM TABLE1
  WHERE Name = @Name
  UNION
  SELECT Name, v
  FROM TABLE2
  WHERE Name = @Name
  UNION
  SELECT Name, v
  FROM TABLE3
  WHERE Name = @Name
) AS AllTables
GROUP BY Name