2016-02-28 83 views
1

编辑:我做了一个错误的写作WHERE Users.Username=?代替WHERE Answers.Username=? SQL AVG()函数返回INT时多列


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

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

通知我只是选择AVG。当我尝试选择更多的列时,它返回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"; 

用户表:

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

答案表:

"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数据库。

感谢您的帮助。

回答

1

正如您所指出的那样,您尝试在此查询中匹配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 
+0

是一个不错的主意,没工作,虽然:( – ImZyzzBrah

+0

尝试新的解决方案 – JCollerton

+0

不,我试图把CAST的一切准备,仍然无法正常工作,找在你的解决方案,你会认为它会工作,但仍然想知道为什么它不起作用。 – ImZyzzBrah