SQL AVG() 函数 returns 多列时的 INT

SQL AVG() function returns INT when multiple columns

编辑:我写错了 WHERE Users.Username=? 而不是 WHERE Answers.Username=?


如果我使用以下语句,我得到正确的平均值 3.33:

public final String SELECT_USER_AND_AVGANSWERS_STMT =
"SELECT AVG(CAST(Answers.Rating AS FLOAT)) FROM Answers "
+ "WHERE Answers.Username=?";

注意我只是 selecting AVG。当我尝试 select 更多列时,它 returns 4,因为它四舍五入了。

public final String SELECT_USER_AND_AVGANSWERS_STMT = 
"SELECT Users.Username, Users.Nickname, AVG(CAST(Answers.Rating AS FLOAT)) "
+ "FROM Users, Answers "
+ "WHERE Users.Username=?"
+ "GROUP BY Users.Username, Users.Nickname";

用户Table:

"CREATE TABLE Users(Username VARCHAR(10) PRIMARY KEY,"
+ "Password VARCHAR(8) NOT NULL,"
+ "Nickname VARCHAR(20) NOT NULL,"
+ "Description VARCHAR(50),"
+ "Photo VARCHAR(4000))";

答案Table:

"CREATE TABLE Answers(AnswerID INTEGER PRIMARY KEY GENERATED ALWAYS AS IDENTITY,"
+ "QuestionID INTEGER NOT NULL,"
+ "SubmittedTime TIMESTAMP NOT NULL,"
+ "Text VARCHAR(300) NOT NULL,"
+ "Username VARCHAR(10) NOT NULL,"
+ "Rating INTEGER DEFAULT 0 NOT NULL)";

使用 Java/嵌入式 Derby 数据库。

感谢您的帮助。

正如您所指出的,您试图在这个查询中匹配 Users.Username,但在第一个查询中匹配 Answers.Username,所以这是一个问题!这应该有效:

SELECT Users.Username, Users.Nickname, AVG(CAST(Answers.Rating AS FLOAT))
FROM Users, Answers
WHERE Answers.Username=?
GROUP BY Users.Username, Users.Nickname

其他可能有问题的是聚合是否发生在 CAST 之前。要检查这一点,您可以使用:

SELECT UserName, NickName, CAST(AVG(AnswersRating) AS FLOAT)
FROM
(
    SELECT Users.Username As UserName, Users.Nickname As NickName, CAST(Answers.Rating AS FLOAT) As AnswersRating
    FROM Users, Answers
    WHERE Answers.Username=?
) AS Float_Table
GROUP BY UserName, NickName