代码之家  ›  专栏  ›  技术社区  ›  Lelio Faieta

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

  •  0
  • Lelio Faieta  · 技术社区  · 9 月前

    我正在尝试将百分比计算为查询中的派生列。 我的查询返回了所有预期的数据,但是 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?

    1 回复  |  直到 9 月前
        1
  •  2
  •   Bill Karwin    9 月前

    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;