我被困在MySQL CASE声明中。我有以下场景,我的表有以下记录:
Header_ID | Marks
------------|----------
55 | 0
55 | 2
66 | 5
66 | 6
我想总结一下Marks,Header_ID。但对于任何给定的标题,如果Marks为0(ZERO),则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
我尝试使用CASE语句" SUM"功能,但得到如下结果:
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.
有人可以帮我吗?
答案 0 :(得分:2)
在这里,我使用IF
来考虑mark
的每个值。如果值为零,则IF
返回1,否则返回0。
然后将这些传递给SUM
以计算有多少值为零。该总和传递给另一个IF
,对于任何正数的零值返回0,否则返回SUM
的{{1}}。即使值序列发生变化,这也应该起作用,例如,对于特定的mark
,当值不时,它应该起作用:
headerid
答案 1 :(得分:0)
CREATE TABLE mark
(head_id INT, marks INT)
INSERT INTO mark VALUES (55,0)
INSERT INTO mark VALUES (55,2)
INSERT INTO mark VALUES (77,1)
INSERT INTO mark VALUES (77,0)
SELECT * FROM mark
SELECT
m1.head_id ,
SUM(CASE WHEN m1.head_id = m2.head_id THEN 0
ELSE m1.marks END) AS mm
FROM
mark m1
LEFT JOIN
(SELECT DISTINCT head_id, NULL marks1 FROM mark WHERE marks = 0) m2
ON m1.head_id = m2.head_id
GROUP BY m1.head_id