【问题标题】:MySQL variable only get last valueMySQL 变量只获取最后一个值
【发布时间】:2020-09-30 08:11:16
【问题描述】:

我需要查询帮助我有这种格式的表格

  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 只从最后一行数据中获取最后一个值。我需要帮助来解决这个问题。

【问题讨论】:

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

标签: mysql sql datetime sum case


【解决方案1】:

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 有一行开始)。

【讨论】:

    猜你喜欢
    • 2022-07-30
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 2018-01-29
    • 1970-01-01
    • 1970-01-01
    • 2019-08-01
    • 1970-01-01
    相关资源
    最近更新 更多