问题描述
我试图为此找到现有的答案,可能错过了。因此,这是我的mysql表的一部分:
+-----+-----------+------------+--------+----------+
| id | is_actual | month | sum | sheet_id |
+-----+-----------+------------+--------+----------+
| 243 | 1 | 2020-02-01 | 0 | 6 |
| 244 | 0 | 2020-02-01 | 100000 | 6 |
| 245 | 1 | 2020-05-01 | 0 | 3 |
| 246 | 1 | 2020-01-01 | 110 | 3 |
| 247 | 1 | 2020-07-01 | 0 | 3 |
| 248 | 1 | 2020-03-01 | 0 | 3 |
| 249 | 1 | 2020-08-01 | 0 | 3 |
| 250 | 1 | 2020-06-01 | 0 | 3 |
| 251 | 1 | 2020-02-01 | 0 | 3 |
| 252 | 1 | 2020-04-01 | 0 | 3 |
| 253 | 0 | 2020-05-01 | 0 | 3 |
| 254 | 0 | 2020-01-01 | 0 | 3 |
在同一查询中,我想对is_actual为true的所有金额求和,然后is_actual为false的所有金额求和:
SUM(CASE `core_costsbudgetpermonth`.`is_actual` = 1 THEN `core_costsbudgetpermonth`.`sum` ELSE 0 END) AS sum_actual
SUM(CASE `core_costsbudgetpermonth`.`is_actual` = 0 THEN `core_costsbudgetpermonth`.`sum` ELSE 0 END) AS sum_not_actual
有什么建议吗?
编辑:
这是我的错误:
错误1064(42000):您的SQL语法有错误;请查看与您的MySQL服务器版本相对应的手册,以获取在'THEN {core_costsbudgetpermonth
。sum
ELSE 0 END)处第1行的'core_costsbudgetpermonth'中使用的正确语法
预期输出如下:
+-------+---------+
+ 20833 | 130626 +
+-------+---------+
解决方法
您甚至不需要这种情况
SUM(is_actual * sum) as sumactual,-SUM((is_actual-1) * sum) as sumnotactual
您可以使用布尔值0或1-将和与布尔值相乘,如果布尔值为false,则布尔值加0,而布尔值为sum
时布尔值加在一起。如果您从布尔值中减去1,则当它为true时将变为0,否则为-1(然后,您需要做的是将负数sum
翻转为(is_actual-1) * -sum
-只要有两倍否定的地方可以解决这个问题)
您甚至可以使用NOT翻转布尔值:
SUM(is_actual * sum) as sumactual,SUM((NOT is_actual) * sum) as sumnotactual
顺便说一句,WASE有两种形式:
CASE
WHEN booleanTest THEN outputvalue
[WHEN otherBooleanTest THEN otherOutputValue ...] --as many WHENs as you like
[ELSE elseValue]
END
CASE variableName
WHEN variableValue THEN outputValue
[WHEN variableValue THEN outputValue ...]
[ELSE elseValue]
END
而且由于SUM忽略NULL(这是CASE WHEN在没有匹配项时输出的内容),因此您也不需要ELSE 0。这意味着您的CASE WHEN
表格可以简化为以下形式:
SUM(CASE is_actual WHEN true THEN sum END) as sumactual,SUM(CASE is_actual WHEN false THEN sum END) as sumnotactual
或
SUM(CASE WHEN is_actual THEN sum END) as sumactual,SUM(CASE WHEN NOT is_actual THEN sum END) as sumnotactual
,
如果是WHEN ...,则您需要在第一个和之后加上逗号