基于另一个布尔列的列的总和,分别为true和false

问题描述

我试图为此找到现有的答案,可能错过了。因此,这是我的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_costsbudgetpermonthsum 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 ...,则您需要在第一个和之后加上逗号

在此处https://dev.mysql.com/doc/refman/5.7/en/case.html查看语法

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...