我在表中有三列:
| PLANNING | ASSESSMENTANDDATA |TOTAL
| One Word | One Test |
| Two Word | Two Test |
我需要为每条记录更新“ TOTAL”列,以便如果“ PLANNING”列中包含“ One”,则将该行的运行总计加1。然后,如果“ ASSESSMENTANDDATA”包含“ 1”,则在该行的运行总计中添加另一个1,然后用2更新“ TOTAL”。下一个记录将是-如果“ PLANNING”列包含“ 2”,则将2添加到运行中总行数。然后,如果“ ASSESSMENTANDDATA”包含“ Two”,则在该行的运行总计中再添加2,然后将“ TOTAL”更新为4。
| 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
答案 0 :(得分:0)
我认为您不需要将Group By
与Sum()
聚合一起使用。如果我们使用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