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%的值)生成此类输出的算法。这是一个非常糟糕的数据库设计。您应该将答案放在与第一个表格相关的表格中。然后你甚至不能很容易地计算出百分比,你也可以自由地使用你喜欢的答案,而无需每次更改数据库