这张桌子被称为 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';