当 Current column 和 Previous column > 0 时,执行此操作

When Current column and Previous column > 0, then do this

mysql> select * from table;
+------+------+------+-------+
| id   | cnta | cntb |  cntc | 
+------+-------------+-------+
4         0      1      2   
3         2      3      0
2         1      0      1   
1         3      2      2

我想比较两个连续行(当前列和前一列),如果它们都大于 0,我想对连续行的结果求和。

这是我尝试过但失败了的方法:

SELECT
         g1.id,
(case        
    When g2.cnta > 0 and g1.cnta > 0 then g1.cnta ELSE 0) End as cnta + 
(case        
    When g2.cntb > 0 and g1.cntb > 0 then g1.cntb ELSE 0) End as cntb +     
(case        
    When g2.cntc > 0 and g1.cntc > 0 then g1.cntc ELSE 0) End as cntc 
 
FROM table g1 INNER JOIN table g2 ON g2.id = g1.id+ 1; 

我试图获得的最终输出是这样的(如果当前列和上一列 > 0,则当前列 1 + 等等):

id    totalcnt
4        1   
3        2
2        2
1 

如何解决我的查询?或者我可以找到替代方法作为解决方案吗?

** 我忘了说我的 table 中没有 NULL 值。只有 0 和正整数。

如果结果的最后一行不为空,试试这个:

SELECT  
t1.id, 
(
CASE WHEN t1.cnta>0 AND t2.cnta>0 THEN t1.cnta ELSE 0 END  
+  
CASE WHEN t1.cntb>0 AND t2.cntb>0 THEN t1.cntb ELSE 0 END
+
CASE WHEN t1.cntc>0 AND t2.cntc>0 THEN t1.cntc ELSE 0 END
) AS cValue    
FROM 
table1 t1 
LEFT JOIN table1 t2 ON t2.id=t1.id-1;

或者如果你真的想让它为空,你可以使用子查询

SELECT 
t1.id,
IFNULL(
(
SELECT 
(
CASE WHEN t1.cnta>0 AND t2.cnta>0 THEN t1.cnta ELSE 0 END  
+  
CASE WHEN t1.cntb>0 AND t2.cntb>0 THEN t1.cntb ELSE 0 END
+
CASE WHEN t1.cntc>0 AND t2.cntc>0 THEN t1.cntc ELSE 0 END
) 
FROM 
table1 t2 WHERE t2.id=t1.id-1)
,'') AS cValue 
FROM table1 t1
SELECT t1.id,
       (t1.cnta * t2.cnta > 0) * t1.cnta
     + (t1.cntb * t2.cntb > 0) * t1.cntb
     + (t1.cntc * t2.cntc > 0) * t1.cntc totalcnt
FROM test t1
LEFT JOIN test t2 ON t1.id = t2.id + 1;

https://dbfiddle.uk/?rdbms=mysql_5.7&fiddle=48f296035e95bf4c7331427e82c25619

t1.cntX * t2.cntX 如果至少有一个值为 NULL,则为 NULL;如果至少有一个值为零,则为零;如果两个值都不为 zero/NULL.

,则为 1