2017-04-16 144 views
0

我想一個表的內容複製到另一個,以下列方式的返回類型:什麼是SQL的AVG()函數

 sql ="INSERT INTO customer (nev, quantity, frequency) SELECT " 
       + "?,COUNT(?),AVG(?)" 
       + "FROM tempcustomer GROUP BY ? ORDER BY COUNT(?) DESC"; 

     preparedStmt=conn.prepareStatement(sql); 
     preparedStmt.setString(1, "nev"); 
     preparedStmt.setString(2, "nev"); 
     preparedStmt.setString(3, "pont"); 
     preparedStmt.setString(4, "nev"); 
     preparedStmt.setString(5, "nev"); 

     preparedStmt.executeUpdate(); 

我收到以下錯誤信息:

com.mysql.jdbc.MysqlDataTruncation: Data truncation: Truncated incorrect DOUBLE value: 'pont' 
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3971) 
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3909) 
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2527) 
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2680) 
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2501) 
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1858) 
at com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2079) 
at com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2013) 
at com.mysql.jdbc.PreparedStatement.executeLargeUpdate(PreparedStatement.java:5104) 
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1998) 
at Sample.main(Sample.java:101) 

我是JDBC新手,預先感謝!

+1

您不能將列名作爲參數傳遞給查詢。只有值。數據庫需要列名來準備查詢,這是準備好的語句的全部要點。如果數據庫不知道要選擇什麼,要分組或排序什麼,它不可能創建執行計劃。 –

+0

你是對的,它解決了問題謝謝! –

回答

0

這取決於參數。正如在documentation解釋:

SUM()AVG()函數返回爲準確值 參數(整數或DECIMAL)一個DECIMAL值,以及用於 近似值參數(FLOATDOUBLE)一個DOUBLE值。

可以通過將其視爲一個數強制字符串參數的數目:

AVG(? + 0) 

然而,諸如'pont'一個值將被轉換爲0,這將包括在平均值計算。

+0

非常感謝! 「'pont''是一個INT列名,它在常規選項 –

+0

@ K.Fia中工作。 。 。如果它是列名稱,那麼您的查詢只能根據觸發器產生該錯誤。 –