MySQL变量仅获取最后一个值

MySQL变量仅获取最后一个值,mysql,sql,datetime,sum,case,Mysql,Sql,Datetime,Sum,Case,我需要有关查询的帮助我有此格式的表 uniqueid|createdDate|ask1|ask2|ask3|ask4|ask5 -------------------------------------------- 10001 |2020-09-30 |Yes |Yes |Yes |Yes |Yes 10002 |2020-09-30 |Yes |No |Yes |Yes |Yes 我想要这样的结果查询 uniqueid|createdDate|Yes|No

我需要有关查询的帮助我有此格式的表

  uniqueid|createdDate|ask1|ask2|ask3|ask4|ask5 
  --------------------------------------------
  10001   |2020-09-30 |Yes |Yes |Yes |Yes |Yes 
  10002   |2020-09-30 |Yes |No  |Yes |Yes |Yes
我想要这样的结果查询

  uniqueid|createdDate|Yes|No|percent
  --------------------------------
  10001   |2020-09-30 |5  |0 |100%
  10002   |2020-09-30 |4  |1 |95%
这是我的问题

SELECT 
  uniqueid,
  createdDate,
  @yes := SUM(CASE WHEN ask1 = 'Yes' THEN 1 ELSE 0 END)+SUM(CASE WHEN ask2 = 'Yes' THEN 1 ELSE 0 END)+SUM(CASE WHEN ask3 = 'Yes' THEN 1 ELSE 0 END)+SUM(CASE WHEN ask4 = 'Yes' THEN 1 ELSE 0 END)+SUM(CASE WHEN ask5 = 'Yes' THEN 1 ELSE 0 END) as 'Yes',
 SUM(CASE WHEN ask1 = 'No' THEN 1 ELSE 0 END)+SUM(CASE WHEN ask2 = 'No' THEN 1 ELSE 0 END)+SUM(CASE WHEN ask3 = 'No' THEN 1 ELSE 0 END)+SUM(CASE WHEN ask4 = 'No' THEN 1 ELSE 0 END)+SUM(CASE WHEN ask5 = 'No' THEN 1 ELSE 0 END) as 'No',
 FLOOR(@yes/5)*100 as 'percent'
FROM table
GROUP BY uniqueid

为什么@yes只从最后一行数据中获取最后一个值。我需要帮助来解决此问题。

select子句中表达式的求值顺序未定义,因此无法保证您的代码将始终执行您想要的操作

我建议重复该表达式,或者使用子查询,而不是依赖变量:

select t.*, 5 - cnt_yes cnt_no, floor(cnt_yes * 100 / 5) percent
from (
    select t.*,
        (ask1 = 'Yes') + (ask2 = 'Yes') + (ask3 = 'Yes') + (ask4 = 'Yes') + (ask5 = 'Yes') cnt_yes
    from mytable t
) t

请注意,对于示例数据,不需要通过聚合来获得所需的结果(首先是每个
uniqueid
有一行)。

1)在分组查询中无法正确处理UDV。2) 解释从显示的源数据(尤其是95%的值)生成此类输出的算法。这是一个非常糟糕的数据库设计。您应该将答案放在与第一个表格相关的表格中。然后你甚至不能很容易地计算出百分比,你也可以自由地使用你喜欢的答案,而无需每次更改数据库