【问题标题】:SELECT within Java like "if Value of previous Month is negative, do sum of Value of the typed Month and the Value of the previous one"在 Java 中选择,例如“如果上个月的值是负数,则将键入的月份的值与上一个月份的值相加”
【发布时间】:2012-11-06 17:11:48
【问题描述】:

该表称为 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,一个获取 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';

【问题讨论】:

    标签: java mysql date select if-statement


    【解决方案1】:

    查询没有问题,唯一的问题是你忘记在PreparedStatement中设置参数了。

    你需要设置 ::

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

    喜欢

     ptmt.setString(1,value)
    

    【讨论】:

    • 糟糕。谢谢!我发现我的部分语法是错误的。我纠正了它,但不是全部。它说“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')" 语法错误。
    • 它们以 1(一)而不是 0(零)开头:docs.oracle.com/javase/1.4.2/docs/api/java/sql/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多