基于同一记录的其他字段中的值更新记录的字段

bxpogfeg  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(319)

表中有三列:

| PLANNING | ASSESSMENTANDDATA |TOTAL
| One Word | One Test          | 
| Two Word | Two Test          |

我需要更新每个记录的“total”列,以便如果“planning”列包含“one”,那么在该行的运行总计中添加1。然后,如果“assessmentanddata”包含“one”,则将另一个1添加到该行的运行总计中,然后用2更新“total”。下一条记录是-如果“planning”列包含“two”,则将2添加到该行的运行总数中。如果'assessmentanddata'包含'two',则将另一个2添加到行的运行总计中,然后用4更新'total'。

| PLANNING | ASSESSMENTANDDATA |TOTAL
| One Word | One Test          | 2
| Two Word | Two Test          | 4

到目前为止我已经做到了:(工作正在进行中-我相信还远没有完成)

SET @runtot := 0;
SELECT 
id,
SUM(CASE 
        WHEN PLANNING like '%One%' THEN @runtot := @runtot + 1
        WHEN PLANNING like '%Two%' THEN @runtot := @runtot + 2
        WHEN ASSESSMENTANDDATA like '%One%' THEN @runtot := @runtot + 1
        WHEN ASSESSMENTANDDATA like '%Two%' THEN @runtot := @runtot + 2
    END)
        FROM RUBERIC
GROUP BY id
py49o6xq

py49o6xq1#

我不认为你需要 Group BySum() 聚合。如果我们使用 Case .. When 表达式,则它将改为嵌套表达式。
但是,我们可以利用mysql的隐式转换和类型转换行为,例如, LIKE %..% 运算符的返回值可以考虑为0/1。我们可以用它来加,而不是写多个 Case .. When 表达。
请尝试以下操作:

SELECT 
  id, 
  PLANNING, 
  ASSESSMENTANDDATA, 
  (@runtot := @runtot + 
             (1 * ((PLANNING like '%One%') + (ASSESSMENTANDDATA like '%One%'))) + 
             (2 * ((PLANNING like '%Two%') + (ASSESSMENTANDDATA like '%Two%')))
  ) AS TOTAL 
FROM RUBERIC
CROSS JOIN (SELECT @runtot := 0) AS user_init_vars

相关问题