2017-04-16 6 views
0

の戻り値の型は何です:次のようにして、私は他に一つのテーブルの内容をコピーしようとしていますSQLのAVG()関数

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) 

 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(); 

私は、次のエラーメッセージが表示されます

私はJDBCに新しいです、事前に感謝!

+1

パラメータとして列名をクエリに渡すことはできません。値のみ。列名は、準備されたステートメントの全体点である、照会を準備するためにデータベースによって必要とされます。データベースが何を選択するのか、何をグループ化するのか、または何を注文するのかが分からなければ、実行計画を作成することはできません。 –

+0

あなたは正しいです、それは問題を解決しましたありがとう! –

答えて

0

引数によって異なります。 documentationで説明したように:

SUM()AVG()機能は、正確な値 引数(整数またはDECIMAL)用DECIMAL値、及び 近似値の引数(FLOAT又はDOUBLE)用DOUBLE値を返します。

あなたは数としてそれを処理することにより、数値に文字列引数を強制することができる:

AVG(? + 0) 

しかし、値など'pont'が平均計算に含まれる0に変換されます。

+0

ありがとうございました! '' pont''はINTカラム名で、通常の選択で動作します –

+0

@ K.Fia。 。 。列名の場合、照会はトリガーに基づいてそのエラーを生成するだけです。 –

関連する問題