计算字段返回 NULL 而不是预期值

问题描述 投票:0回答:1

我正在尝试计算查询中派生列的百分比。 我的查询返回所有预期数据,但百分比列上有

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?

mysql
1个回答
0
投票

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;
© www.soinside.com 2019 - 2024. All rights reserved.