我正在尝试计算查询中派生列的百分比。 我的查询返回所有预期数据,但百分比列上有
NULL
。
SELECT items_type_catalog.id,
items_type_catalog.description,
items_header.tipo, items_type_catalog.color,
@solved :=COUNT(CASE WHEN (items_header.stato = 4 OR items_header.stato= 5) THEN 1 END) AS solved,
@tutti:=count(items_header.id) as tutti,
(ROUND(@solved/@tutti,0)*100) as percentage
FROM items_type_catalog LEFT JOIN items_header ON items_type_catalog.id=items_header.tipo AND items_header.progetto=1
GROUP BY items_type_catalog.id, tipo
我看不出我在这一点上做错了什么。为什么它不进行数学运算并返回 NULL?
https://dev.mysql.com/doc/refman/8.0/en/user-variables.html
涉及用户变量的表达式的求值顺序未定义。例如,无法保证
首先评估SELECT @a, @a:=@a+1
然后执行分配。@a
这意味着您所显示的用法(假设在计算
@solved
表达式之前分配了 @tutti
和 percentage
)是不可靠的。
更好的方法是参考将查询放入子查询中,然后使用别名计算外部查询中的表达式:
SELECT id, description, tipo, color, solved, tutti,
(ROUND(solved/tutti,0)*100) as percentage
FROM (
SELECT
items_type_catalog.id,
items_type_catalog.description,
items_header.tipo,
items_type_catalog.color,
COUNT(CASE WHEN (items_header.stato = 4 OR items_header.stato= 5) THEN 1 END) AS solved,
COUNT(items_header.id) AS tutti
FROM items_type_catalog
LEFT JOIN items_header
ON items_type_catalog.id=items_header.tipo AND items_header.progetto=1
GROUP BY items_type_catalog.id, tipo
) AS t;