查询以计算多行中大于0的总字段数

时间:2014-10-11 00:23:04

标签: mysql sql

我的数据库布局是这样的。

id(primary key) | serial | channel | level1 | level2 | level3 | level4 | updated (datetime field)

对于每个串口,我有4到8个通道。我可以通过提供此查询来查看所有这些数据

SELECT * FROM 
(SELECT channel, level1, level2, level3, level4, updated
FROM levels 
WHERE serial='013-315-122' 
ORDER BY channel DESC) 
AS q1 
GROUP BY channel 
ORDER BY channel 

数据每天更新多次,因此上述查询仅向我提供最新数据。我想要做的是能够计算序列号中大于零的level1,level2,level3和level4中的字段数。请记住,每个串口有4到8个通道,所以我想选择串行的所有通道,并计算每个大于零的水平字段的总数。

我知道如何为单行执行此操作,只是不确定如何为多行执行此操作以获得总计。

1 个答案:

答案 0 :(得分:1)

不确定你想要的输出是什么,但也许这样你想要的东西?

SELECT 
    serial, 
    SUM(
       CASE WHEN level1 > 0 THEN 1 ELSE 0 END + 
       CASE WHEN level2 > 0 THEN 1 ELSE 0 END + 
       CASE WHEN level3 > 0 THEN 1 ELSE 0 END + 
       CASE WHEN level4 > 0 THEN 1 ELSE 0 END 
    ) ActiveChannelCount

FROM levels 
WHERE updated = (
  SELECT MAX(updated) 
  FROM levels l2
  WHERE levels.serial = l2.serial 
  AND levels.channel = l2.channel
  GROUP BY serial, channel
) 
# AND serial='013-315-122' 
GROUP BY serial
ORDER BY serial

输出就像:

serial               ActiveChannelCount
-------------------- ------------------
013-315-122          11
999-315-122          15

请参阅此示例SQL Fiddle