我被 MySQL CASE 语句困住了。我有以下场景,我的表有以下记录:
Header_ID | Marks
------------|----------
55 | 0
55 | 2
66 | 5
66 | 6
我想总结一下 Header_ID 方面的标记。但对于任何给定的 header ,如果 Marks 为 0(零),则 SUM 必须设置为 0。因此结果应如下所示:
Header_ID | TOTAL_Marks
------------|------------
55 | 0 --> One of the Header has 0 marks so I must have 0 here.
66 | 11 --> This is sum of Marks for Header_ID 66
我尝试使用带有“SUM”函数的 CASE 语句,但得到的结果如下:
SELECT
S.`headerid` AS `HEADER_ID`,
CASE
WHEN S.`mark` = 0 THEN 0
ELSE SUM(S.`mark`)
END AS `TOTAL_MARKS`
FROM sample_db.sheet_data S
GROUP BY S.`headerid`;
RESULT:
HEADER_ID | TOTAL_MARKS
-----------|-------------
55 | 2 --> Here it is not getting the expected value.
66 | 11 --> This is sum of Marks for Header_ID 66
SUM 函数是 CASE 语句,返回值 2,我想将其设置为 0。
有人可以帮我吗?
最佳答案
这里我使用 IF
来考虑 mark
的每个值。如果值为零,IF
返回 1,否则返回 0。
然后将这些值传递给 SUM
以计算有多少个值为零。该总和被传递给另一个 IF
,对于任何正数的零值,它返回 0,否则返回 mark
的 SUM
。即使值的顺序发生变化,这也应该起作用,例如,对于特定的 headerid
,零值不是第一个:
SELECT S.headerid as `HEADER_ID`,
IF(SUM(IF(S.`mark` = 0, 1, 0)) > 0, 0, SUM(S.`mark`)) AS `TOTAL_MARKS`
FROM sample_db.sheet_data S
GROUP BY S.`headerid`;
关于MySQL Case 语句与聚合函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22564823/