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
编辑:我写错了 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