0

テーブルは imposto と呼ばれます。

+------------------+------------+------+-----+---------+-------+
| Field            | Type       | Null | Key | Default | Extra |
+------------------+------------+------+-----+---------+-------+
| cod_bolsa        | varchar(7) | NO   | PRI | NULL    |       |
| mes              | date       | NO   | PRI | NULL    |       |
| ano              | date       | NO   | PRI | NULL    |       |
| lucro_mes_vista  | double     | NO   |     | NULL    |       |
| preju_mes_vista  | double     | NO   |     | NULL    |       |
| lucro_mes_ouro   | double     | NO   |     | NULL    |       |
| preju_mes_ouro   | double     | NO   |     | NULL    |       |
| resul_mes_demais | double     | NO   |     | NULL    |       |
| venda_vista      | double     | NO   |     | NULL    |       |
| venda_ouro       | double     | NO   |     | NULL    |       |
| resul_mes        | double     | NO   |     | NULL    |       |
| resul_acu        | double     | NO   |     | NULL    |       |
| base_calc        | double     | NO   |     | NULL    |       |
| imp_renda        | double     | NO   |     | NULL    |       |
| imp_recol_mes    | double     | NO   |     | NULL    |       |
| base_calc_irrf   | double     | NO   |     | NULL    |       |
| imp_retido_acu   | double     | NO   |     | NULL    |       |
| imp_devido       | double     | NO   |     | NULL    |       |
+------------------+------------+------+-----+---------+-------+

3 つの JTextFields。1 つは cod_bolsa を取得するため、もう 1 つは me (月) を取得するため、最後の 1 つは ano (年) を取得するためです。

resul_acu は lucro_mes_vista (選択した月の利益) と preju_mes_vista (選択した月の損失) の合計です。

result_acu が正の場合: imp_retido_acu は 0 です。

前月の preju_mes_vista 値 (符号なし) がその月の lucro_mes_vista よりも大きい場合 (つまり、利益よりも損失の方が多い場合): imp_retido_acu は、選択した月の imp_recol_mes (lucro_mes_vista の 0.005% + preju_mes_vista の値) の合計です。および前月の imp_recol_mes。

私は試した:

String sql = "SELECT a.cod_bolsa AS Codigo, "
            + "a.nome AS Nome, "
            + "b.data AS Data, "
            + "b.lucro_mes_vista AS Lucro_do_Mes_Acoes_Vista, "
            + "b.preju_mes_vista AS Prejuizo_do_Mes_Acoes_Vista, "
            + "b.venda_vista AS Venda_Acoes_Vista, "
            + "b.lucro_mes_vista+b.preju_mes_vista AS Resultado_do_Mes, "
            + "b.lucro_mes_vista+b.preju_mes_vista AS Resultado_Acumulado, "
            + "b.base_calc AS Base_de_Calculo, "
            + "b.imp_renda AS Imposto_de_Renda, "
            + "(b.lucro_mes_vista+b.preju_mes_vista)*0.00005 AS Imposto_Recolhido_no_Mes, "
            + "b.base_calc_irrf AS Base_de_Calculo_IRRF, "

            + "b.imp_retido_acu "
            + "IF((b.lucro_mes_vista+b.preju_mes_vista)>0, "
            + "imp_retido_acu=0 " // if true
            + "AS Imposto_Retido_Acumulado, "

            + "b.imp_retido_acu=((b.lucro_mes_vista+b.preju_mes_vista)*0.00005)+"
            + "(b.lucro_mes_vista+b.preju_mes_vista)*0.00005) " // if false
            + "AS Imposto_Retido_Acumulado "

            + "WHERE DATE_FORMAT(STR_TO_DATE(b.data,'%Y-%m') = DATE_FORMAT("
            + "DATE_ADD(STR_TO_DATE(b.data,'%Y-%m'), INTERVAL -1 MONTH), '%Y-%m') "

            + "b.imp_devido AS Imposto Devido "

            + "FROM cadastro a LEFT OUTER JOIN imposto b USING (cod_bolsa) "
            + "WHERE a.cod_bolsa=?, MONTH(b.mes)=? AND YEAR(b.ano)=? ";

    String consCod = FrmImposto.txtCodImp.getText();
    String consMes = FrmImposto.txtMes.getText();
    String consAno = FrmImposto.txtAno.getText();

Sashi Kant の修正前に txtCodImp フィールドに入力するときにパラメーター 1 を指定したにもかかわらず、次のエラーが発生していました。

java.sql.SQLException: No value specified for parameter 1
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1074)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:988)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:974)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:919)
    at com.mysql.jdbc.PreparedStatement.checkAllParametersSet(PreparedStatement.java:2603)
    at com.mysql.jdbc.PreparedStatement.fillSendPacket(PreparedStatement.java:2578)
    at com.mysql.jdbc.PreparedStatement.fillSendPacket(PreparedStatement.java:2502)
    at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2259)
    at view.ListarImposto.Pstmt_executeQuery_PopulaTabela(ListarImposto.java:145)
    at view.ListarImposto.<init>(ListarImposto.java:91)
    at view.FrmImposto.jButton2ActionPerformed(FrmImposto.java:109)
    at view.FrmImposto.access$000(FrmImposto.java:11)
    at view.FrmImposto$1.actionPerformed(FrmImposto.java:51)

EDIT1:今、私はこれを手に入れました。これはより深刻です:

MySQLSyntaxErrorException:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near
'WHERE DATE_FORMAT(STR_TO_DATE(b.data,'%Y-%m') = DATE_FORMAT(DATE_ADD(STR_TO_DATE'
at line 1

EDIT2: データベースの先生に聞いたところ、いくつかの進歩がありました。

SELECT cod_bolsa AS cod_venda,
DATE_FORMAT(data, '%Y-%m') AS mes_venda, SUM(qtd_venda*preco_venda) AS valor_venda
FROM movimentacao
WHERE cod_bolsa='0000002';

SELECT cod_bolsa AS cod_compra, DATE_FORMAT(data, '%Y-%m') AS mes_compra, SUM(qtd_compra*preco_compra) AS valor_compra
FROM movimentacao
WHERE cod_bolsa='0000002';

valor_compra は lucro_mes_vista と同じで、valor_venda は prejuizo_mes_vista と同じです。

上記の SELECT の結果:

+-----------+-----------+-------------+
| cod_venda | mes_venda | valor_venda |
+-----------+-----------+-------------+
| 0000002   | 2012-08   |      337.25 |
+-----------+-----------+-------------+

+------------+------------+--------------+
| cod_compra | mes_compra | valor_compra |
+------------+------------+--------------+
| 0000002    | 2012-08    |        181.8 |
+------------+------------+--------------+

Resultado_do_Mes を取得するには:

SELECT venda.data_venda, compra.data_compra,
(venda.valor_venda)-(compra.valor_compra) AS resultado_do_mes

FROM
(SELECT cod_bolsa cod_venda, DATE_FORMAT(data, '%Y-%m-%d') AS data_venda, 
SUM(qtd_venda*preco_venda) AS valor_venda

FROM movimentacao
GROUP BY cod_bolsa) venda

LEFT JOIN
(SELECT cod_bolsa AS cod_compra, data AS data_compra, 
SUM(qtd_compra*preco_compra) AS valor_compra

FROM movimentacao
GROUP BY cod_bolsa) compra

ON compra.cod_compra = venda.cod_venda AND compra.data_compra = venda.data_venda

WHERE venda.cod_venda = '0000002'
OR compra.cod_compra = '0000002';
4

1 に答える 1

1

クエリに問題はありません。唯一の問題は、PreparedStatement でパラメーターを設定するのを忘れていることです。

::を設定する必要があります

a.cod_bolsa=?, MONTH(b.mes)=? AND YEAR(b.ano)=? ";

お気に入り

 ptmt.setString(1,value)
于 2012-11-18T17:40:27.100 に答える