【 TiDB 使用环境】生产环境
【 TiDB 版本】TiDB v5.3.0、TiDB v6.1.2
【复现路径】
- 创建测试表及测试数据
CREATE TABLE `t_tbl02` (
`贷款` decimal(40,2) DEFAULT NULL COMMENT '贷款'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
CREATE TABLE `t_test` (
`企业名称` varchar(255) DEFAULT NULL,
`信用代码` varchar(255) DEFAULT NULL,
`年度` int(11) DEFAULT NULL,
`yysr_2_ago` decimal(20,2) DEFAULT NULL,
`yysr_1_ago` decimal(20,2) DEFAULT NULL,
`yysr_current` decimal(20,2) DEFAULT NULL,
`ldzc_1_ago` decimal(20,2) DEFAULT NULL,
`ldzc_2_ago` decimal(20,2) DEFAULT NULL,
`ldfz_1_ago` decimal(20,2) DEFAULT NULL,
`ldfz_2_ago` decimal(20,2) DEFAULT NULL,
`syzqy_1_ago` decimal(20,2) DEFAULT NULL,
`gdzc_1_ago` decimal(20,2) DEFAULT NULL,
`gdzc_2_ago` decimal(20,2) DEFAULT NULL,
`wxzc_1_ago` decimal(20,2) DEFAULT NULL,
`wxzc_2_ago` decimal(20,2) DEFAULT NULL,
`cqjk_1_ago` decimal(20,2) DEFAULT NULL,
`ch_1_ago` decimal(20,2) DEFAULT NULL,
`ch_2_ago` decimal(20,2) DEFAULT NULL,
`yszk_1_ago` decimal(20,2) DEFAULT NULL,
`yszk_2_ago` decimal(20,2) DEFAULT NULL,
`yfzk_1_ago` decimal(20,2) DEFAULT NULL,
`yfzk_2_ago` decimal(20,2) DEFAULT NULL,
`ljzj_1_ago` decimal(20,2) DEFAULT NULL,
`dqjk_1_ago` decimal(20,2) DEFAULT NULL,
`lrze_1_ago` decimal(20,2) DEFAULT NULL,
`jlr_1_ago` decimal(20,2) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
-- 2.2 插入测试数据
INSERT INTO `t_test` (`企业名称`, `信用代码`, `年度`, `yysr_2_ago`, `yysr_1_ago`, `yysr_current`, `ldzc_1_ago`, `ldzc_2_ago`, `ldfz_1_ago`, `ldfz_2_ago`, `syzqy_1_ago`, `gdzc_1_ago`, `gdzc_2_ago`, `wxzc_1_ago`, `wxzc_2_ago`, `cqjk_1_ago`, `ch_1_ago`, `ch_2_ago`, `yszk_1_ago`, `yszk_2_ago`, `yfzk_1_ago`, `yfzk_2_ago`, `ljzj_1_ago`, `dqjk_1_ago`, `lrze_1_ago`, `jlr_1_ago`) VALUES ('PingCapTiDB', '91210102555343453T', 2017, 0.00, 0.00, 0.00, 2857907.48, 0.00, 11677684.98, 0.00, -8623888.37, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 2726700.50, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00);
INSERT INTO `t_test` (`企业名称`, `信用代码`, `年度`, `yysr_2_ago`, `yysr_1_ago`, `yysr_current`, `ldzc_1_ago`, `ldzc_2_ago`, `ldfz_1_ago`, `ldfz_2_ago`, `syzqy_1_ago`, `gdzc_1_ago`, `gdzc_2_ago`, `wxzc_1_ago`, `wxzc_2_ago`, `cqjk_1_ago`, `ch_1_ago`, `ch_2_ago`, `yszk_1_ago`, `yszk_2_ago`, `yfzk_1_ago`, `yfzk_2_ago`, `ljzj_1_ago`, `dqjk_1_ago`, `lrze_1_ago`, `jlr_1_ago`) VALUES ('PingCapTiDB', '91210102555343453T', 2018, 0.00, -0.01, 23300.97, 2992987.08, 2857907.48, 11742867.69, 11677684.98, -8739739.48, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 2726700.50, 2726700.50, 0.00, 0.00, 0.00, 0.00, -115851.11, -115851.11);
INSERT INTO `t_test` (`企业名称`, `信用代码`, `年度`, `yysr_2_ago`, `yysr_1_ago`, `yysr_current`, `ldzc_1_ago`, `ldzc_2_ago`, `ldfz_1_ago`, `ldfz_2_ago`, `syzqy_1_ago`, `gdzc_1_ago`, `gdzc_2_ago`, `wxzc_1_ago`, `wxzc_2_ago`, `cqjk_1_ago`, `ch_1_ago`, `ch_2_ago`, `yszk_1_ago`, `yszk_2_ago`, `yfzk_1_ago`, `yfzk_2_ago`, `ljzj_1_ago`, `dqjk_1_ago`, `lrze_1_ago`, `jlr_1_ago`) VALUES ('PingCapTiDB', '91210102555343453T', 2019, -0.01, 23300.97, 9265462.04, 2694362.03, 2992987.08, 13684986.55, 11742867.69, -10980483.39, 10141.13, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 2579575.50, 2726700.50, 0.00, 0.00, 0.00, 0.00, -2240743.91, -2240743.91);
INSERT INTO `t_test` (`企业名称`, `信用代码`, `年度`, `yysr_2_ago`, `yysr_1_ago`, `yysr_current`, `ldzc_1_ago`, `ldzc_2_ago`, `ldfz_1_ago`, `ldfz_2_ago`, `syzqy_1_ago`, `gdzc_1_ago`, `gdzc_2_ago`, `wxzc_1_ago`, `wxzc_2_ago`, `cqjk_1_ago`, `ch_1_ago`, `ch_2_ago`, `yszk_1_ago`, `yszk_2_ago`, `yfzk_1_ago`, `yfzk_2_ago`, `ljzj_1_ago`, `dqjk_1_ago`, `lrze_1_ago`, `jlr_1_ago`) VALUES ('PingCapTiDB', '91210102555343453T', 2020, 23300.97, 9265462.04, 14023278.00, 9336012.96, 2694362.03, 18636168.47, 13684986.55, -9290014.38, 10141.13, 10141.13, 0.00, 0.00, 0.00, 0.00, 0.00, 9103051.50, 2579575.50, 0.00, 0.00, 0.00, 0.00, 1690469.01, 1690469.01);
【遇到的问题:问题现象及影响】
- 问题 SQL
insert into t_tbl02(
贷款
)
SELECT
CAST(xq1 AS DECIMAL(40,2)) 贷款
FROM
(
SELECT
企业名称,
信用代码,
年度,
CASE WHEN yysr_1_ago != 0 AND ldzc_1_ago+ldzc_2_ago-ldfz_1_ago-ldfz_2_ago != 0 THEN ROUND(yysr_1_ago*1.000*(1-lrze_1_ago*1.000/yysr_1_ago)*yysr_current/yysr_1_ago/(yysr_1_ago*2.000/(ldzc_1_ago+ldzc_2_ago-ldfz_1_ago-ldfz_2_ago)) - syzqy_1_ago+gdzc_1_ago+wxzc_1_ago-cqjk_1_ago - dqjk_1_ago,2) ELSE NULL END xq1
,yysr_current 指数平滑预测值
,gdzc_1_ago-gdzc_2_ago+ch_1_ago-ch_2_ago+yszk_1_ago-yszk_2_ago-yfzk_1_ago+yfzk_2_ago-ljzj_1_ago-jlr_1_ago xq2
,gdzc_1_ago-gdzc_2_ago+wxzc_1_ago-wxzc_2_ago xq3
,CASE WHEN (CASE WHEN yysr_1_ago != 0 AND ldzc_1_ago+ldzc_2_ago-ldfz_1_ago-ldfz_2_ago != 0 THEN yysr_1_ago*1.000*(1-lrze_1_ago*1.000/yysr_1_ago)*yysr_current/yysr_1_ago/(yysr_1_ago*2.000/(ldzc_1_ago+ldzc_2_ago-ldfz_1_ago-ldfz_2_ago)) - syzqy_1_ago+gdzc_1_ago+wxzc_1_ago-cqjk_1_ago - dqjk_1_ago ELSE NULL END) > 0 THEN 1 ELSE 0 END xqpg1
,CASE WHEN gdzc_1_ago-gdzc_2_ago+ch_1_ago-ch_2_ago+yszk_1_ago-yszk_2_ago-yfzk_1_ago+yfzk_2_ago-ljzj_1_ago-jlr_1_ago > 0 THEN 1 ELSE 0 END xqpg2
,CASE WHEN gdzc_1_ago-gdzc_2_ago+wxzc_1_ago-wxzc_2_ago > 0 THEN 1 ELSE 0 END xqpg3
FROM t_test F
) G WHERE 企业名称 = 'PingCapTiDB' AND 年度= 2018;
- 报错的数值对应的应该是如下部分计算的中间结果
-237141453587819371373.322233045883214006350133
yysr_1_ago*1.000*(1-lrze_1_ago*1.000/yysr_1_ago)*yysr_current/yysr_1_ago/(yysr_1_ago*2.000/(ldzc_1_ago+ldzc_2_ago-ldfz_1_ago-ldfz_2_ago))
- 问题现象
SELECT 查询语句没问题,加入 INSERT 时报错 1292 - Truncated incorrect DECIMAL value: '-237141453587819371373.322233045883214006350133'
在 MySQL 中测试,没有此种问题。
- 重现问题的 SQL 脚本。
t_test.sql (5.3 KB)