【问题标题】:(Error 1366 SQL) Incorrect DECIMAL value '()'(错误 1366 SQL)不正确的 DECIMAL 值 '()'
【发布时间】:2021-11-16 23:59:03
【问题描述】:

我正在为 WindRose 开发一个 SP,当我尝试运行该 SP 时,SQL 显示此错误。

(Error 1366 SQL) Incorrect DECIMAL value '()' for column "" at row -1

修改我收集数据的表后出现此问题。在我为另一个表创建此 SP 之前它工作正常,但我不得不更改表,因为这是接收实时数据的表。

CREATE TEMPORARY TABLE viento_count(angulo DECIMAL, val1 INT, val2 INT, val3 INT, val4 INT, val5 INT, val6 INT);
    
    myloop: LOOP
    
    IF angle > 350 THEN
        LEAVE myloop;
    END IF;

    SET angle1 = angle;
    SET angle2 = angle + 15;
    SET angle_grf = angle + 15/2;
    
    
    SET valor1 = (SELECT COUNT(*) FROM vw_wind_counter WHERE speedy <= 3 AND (device_id = codigo_estacion) AND (data_time BETWEEN fecha_consulta_first_day AND fecha_consulta_last_day) AND direccion > angle1 AND direccion <= angle2);
    SET valor2 = (SELECT COUNT(*) FROM vw_wind_counter WHERE speedy > 3 AND speedy <= 6 AND (device_id = codigo_estacion) AND (data_time BETWEEN fecha_consulta_first_day AND fecha_consulta_last_day) AND direccion > angle1 AND direccion <= angle2);
    SET valor3 = (SELECT COUNT(*) FROM vw_wind_counter WHERE speedy > 6 AND speedy <= 9 AND (device_id = codigo_estacion) AND (data_time BETWEEN fecha_consulta_first_day AND fecha_consulta_last_day) AND direccion > angle1 AND direccion <= angle2);
    SET valor4 = (SELECT COUNT(*) FROM vw_wind_counter WHERE speedy > 9 AND speedy <= 13 AND (device_id = codigo_estacion) AND (data_time BETWEEN fecha_consulta_first_day AND fecha_consulta_last_day) AND direccion > angle1 AND direccion <= angle2);
    SET valor5 = (SELECT COUNT(*) FROM vw_wind_counter WHERE speedy > 13 AND speedy <= 18 AND (device_id = codigo_estacion) AND (data_time BETWEEN fecha_consulta_first_day AND fecha_consulta_last_day) AND direccion > angle1 AND direccion <= angle2);
    SET valor6 = (SELECT COUNT(*) FROM vw_wind_counter WHERE speedy > 18 AND (device_id = codigo_estacion) AND (data_time BETWEEN fecha_consulta_first_day AND fecha_consulta_last_day) AND direccion > angle1 AND direccion <= angle2);
    
    INSERT INTO viento_count SELECT angle_grf AS angulo, valor1 AS val1, valor2 AS val2, valor3 AS val3, valor4 AS val4, valor5 AS val5, valor6 AS val6;
    
    SET angle = angle + 15;
    
    END LOOP myloop;
    
    SELECT * FROM viento_count;
    DROP TEMPORARY TABLE viento_count;  

目前,我从(vw_wind_counter) 视图中获取数据,其中我将CAST 速度和方向数据转换为DECIMAL 值。 我看过另一个关于这个问题的帖子,但其中很多是关于错误的数据插入。

【问题讨论】:

  • 您似乎从未将您的 angle 变量初始化为 0
  • @MatBaillie,我做到了,我将变量初始化为DECLARE angle INT DEFAULT 0;

标签: mysql sql stored-procedures view temp-tables


【解决方案1】:

您似乎从未将您的 angle 变量初始化为 0,因此它是未定义的。

也就是说,您不需要变量或循环...

只需使用您感兴趣的不同角度的表格,然后使用条件聚合COUNT() 内部带有CASE 表达式)

INSERT INTO
  viento_count (angulo, val1, val2, val3, val4, val5, val6)
SELECT
  CAST(a.angle AS DECIMAL(4,1)) + 7.5,
  COUNT(CASE WHEN                   w.speedy <= 3  THEN 1 END),
  COUNT(CASE WHEN w.speedy > 3  AND w.speedy <= 6  THEN 1 END),
  COUNT(CASE WHEN w.speedy > 6  AND w.speedy <= 9  THEN 1 END),
  COUNT(CASE WHEN w.speedy > 9  AND w.speedy <= 13 THEN 1 END),
  COUNT(CASE WHEN w.speedy > 13 AND w.speedy <= 18 THEN 1 END),
  COUNT(CASE WHEN w.speedy > 18                    THEN 1 END)
FROM
  vw_wind_counter   AS w
CROSS JOIN
(
  SELECT
    (a*5+b)*15   AS angle
  FROM
    (select 0 a union all select 1 union all select 2 union all select 3 union all select 4) t1,
    (select 0 b union all select 1 union all select 2 union all select 3 union all select 4) t2
  WHERE
    (a*5+b)*15 < 360
)
  AS a
WHERE
      w.device_id = codigo_estacion
  AND w.data_time BETWEEN fecha_consulta_first_day AND fecha_consulta_last_day
  AND w.direccion >  a.angle
  AND w.direccion <= a.angle + 15

注意:子查询只是创建一个角度表,角度从 0 到 345,增量为 15。

另外:范围传统上是(&gt;= and &lt;),而不是(&gt; and &lt;=)。例如,您当前的代码包含direccion = 360,但排除 direccion = 0,这是不寻常的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-07
    • 1970-01-01
    • 1970-01-01
    • 2017-03-18
    • 1970-01-01
    • 2012-08-08
    相关资源
    最近更新 更多