我现在正在尝试使用 Singlestat 面板来显示特定时间的累积 uph。 所需的输出只是 4 位数字(例如:7000)。 该表采用小时格式,显示累计 uph(每小时单位数)。
这在 Navicat 中运行良好并显示了所需的结果。
下面是MySQL查询。但每当我运行它时它都会显示此错误。 “错误 1064:您的 SQL 语法有错误;请检查与您的 MySQL 服务器版本相对应的手册,了解在 'SET @cumulative_uphB := 0; 附近使用的正确语法”
您当前的查询存在许多问题。
让我们从最里面的查询开始:
SELECT
DATE_FORMAT(NOW(), '%H') AS hour,
uph AS incremental_uph
FROM tb_monthly
WHERE
(
(DATE_FORMAT(NOW(), '%H') BETWEEN '06' AND '17')
OR
(DATE_FORMAT(NOW(), '%H') BETWEEN '18' AND '23')
OR
(DATE_FORMAT(NOW(), '%H') BETWEEN '00' AND '05')
)
AND customer = 'TSB'
AND xmodel = 'FJ1XC'
AND line = '3'
AND assembly = 'MOTOR'
GROUP BY DATE_FORMAT(NOW(), '%H')
您应该收到如下错误:
错误代码:1055。SELECT 列表的表达式 #2 不在 GROUP BY 子句中,并且包含非聚合列“tb_monthly.uph”,该列在功能上不依赖于 GROUP BY 子句中的列;这与 sql_mode=only_full_group_by
不兼容
因为最里面的查询是非确定性的。如果它没有引发错误,则必须禁用
ONLY_FULL_GROUP_BY
,这不好(请参阅only_full_group_by 模式的好处是什么?)。
考虑以下三行(猜测是因为您尚未提供示例数据):
时间 | 呃 | 顾客 | x模型 | 线 | 组装 |
---|---|---|---|---|---|
13 | 600 | 交通运输安全委员会 | FJ1XC | 3 | 电机 |
14 | 700 | 交通运输安全委员会 | FJ1XC | 3 | 电机 |
15 | 800 | 交通运输安全委员会 | FJ1XC | 3 | 电机 |
鉴于当前时间
15:57:17
(我在撰写本文时的区域设置),您最里面的 SELECT 等于(在 GROUP BY 之前):
小时 | 增量_uph |
---|---|
15 | 600 |
15 | 700 |
15 | 800 |
现在你的
GROUP BY
想要将其“压缩”到一行。它应该返回 uph
的哪个值?另外,由于 GROUP BY
中的表达式具有恒定值,因此与编写 GROUP BY 'donkey'
相同。
DATE_FORMAT(NOW(), '%H')
子句中的三个WHERE
标准没有任何作用,因为其中之一永远是正确的。
第一个相当长的 CASE 操作:
CASE
WHEN time = '06' THEN '1'
WHEN time = '07' THEN '2'
...
WHEN time = '05' THEN '24'
END AS sequence,
然后将其转换为 SIGNED INT -
ORDER BY CAST(sequence AS SIGNED)
,可以简化为:
IF (time > '05', time - 5, time + 24 - 5) AS sequence,
第二个大CASE操作与嵌套的CASE操作,可以简化为:
CASE
WHEN time IN ('02', '08', '15', '20') THEN uph * 0.5
WHEN time IN ('05', '17') THEN uph * 0.75
ELSE uph
END AS uph
累积可能存在问题
SUM
,具体取决于您预期的累积顺序。应该是 hours.hour
(当前)还是 sequence
?
最后,正如 Akina 已经指出的那样在评论中,您应该在查询中初始化用户变量,而不是依赖能够执行多个查询。