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 个 JTextField,一个用于获取 cod_bolsa,另一个用于获取 mes(月),最后一个用于获取 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 + preju_mes_vista 的 0.005%)之间的总和和上个月的 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 回答