具有聚合函数的MySQL Case语句

时间:2014-03-21 16:55:15

标签: mysql case

我被困在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.

有人可以帮我吗?

2 个答案:

答案 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

enter image description here

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

enter image description here