如何选择行数乘以非零列? (MySQL的)

时间:2013-01-20 21:58:31

标签: php mysql sql

假设我有一张桌子:

col1, col2, col3
1     0     1.3
0     0     0
0     1     0
1     1.5   1

现在,假设每行的“权重”计算如下:

(col1 > 0 ? 1 : 0) + (col2 > 0 ? 1 : 0) + (col3 > 0 ? 1 : 0)

如何选择所有行的总重量?

根据我给出的数据,总重量是2 + 0 + 1 + 3 = 6

1 个答案:

答案 0 :(得分:5)

您只需要一个聚合SUM()围绕所有条件,而不是GROUP BY

SELECT
  SUM(
   (CASE WHEN col1 > 0 THEN 1 ELSE 0 END)
   + (CASE WHEN col2 > 0 THEN 1 ELSE 0 END)
   + (CASE WHEN col3 > 0 THEN 1 ELSE 0 END)
  ) AS total_weight
FROM your_table

http://sqlfiddle.com/#!2/b0d82/1

我在这里使用CASE WHEN...,因为它可以在任何RDBMS上移植。由于MySQL会为条件返回布尔值0或1,因此可以在MySQL中简化为:

SELECT
  SUM(
   (col1 > 0) /* returns 1 or 0 */
    + (col2 > 0)
    + (col3 > 0)
   ) AS total_weight
FROM your_table

http://sqlfiddle.com/#!2/b0d82/2