如何计算数据库的水平值?

Mat*_*yr' 5 mysql field unpivot count

假设我有一个像这样的水平结构的数据库:

ID | NAME | DATA1 | DATA2 | DATA3 | DATA4 | DATA5 | DATA6 | DATA7
 1 |  mmm |   0   |   1   |   0   |   3   |   5   |   1   |   0
 2 |  bbb |   0   |   0   |   0   |   1   |   0   |   1   |   1
Run Code Online (Sandbox Code Playgroud)

信息是数据字段,我想计算某个判别式的所有时间,例如"大于0"

我认为它是循环所有领域,计数或COUNT()每个DATA领域的方式,所以SUM()那些7查询...任何人有另一个想法?

在这种情况下结果,所以"count every DATA field with a value over 0"将= 7

And*_*y M 5

没有内置语法允许您动态引用一组列,即没有明确命名它们.如果需要动态性,则需要查询元数据以获取所需的列名,然后动态构建最终查询.

但在此之前,您仍然需要了解动态查询应该如何完成执行作业本身.因此,您首先需要在有限列集上解决问题.

解决这个问题的方法不止一种.@bluefeet建议方法可能是更清晰,效率更低的方法之一.您可以尝试至少两种选择:

  1. 使用条件聚合分别计算每列,并将所有结果汇总到一个表达式中:

    SELECT
      COUNT(DATA1 > 0 OR NULL) +
      COUNT(DATA2 > 0 OR NULL) +
      COUNT(DATA3 > 0 OR NULL) +
      COUNT(DATA4 > 0 OR NULL) +
      COUNT(DATA5 > 0 OR NULL) +
      COUNT(DATA6 > 0 OR NULL) +
      COUNT(DATA7 > 0 OR NULL) AS TOTAL
    FROM yourtable
    ;
    
    Run Code Online (Sandbox Code Playgroud)

    (这里OR NULL解释这个技巧.)

  2. DATA使用交叉连接取消激活列到虚拟表,然后将条件应用于unpivoted列:

    SELECT
      COUNT(*) AS TOTAL
    FROM (
      SELECT
        CASE s.col
          WHEN 'DATA1' THEN DATA1
          WHEN 'DATA2' THEN DATA2
          WHEN 'DATA3' THEN DATA3
          WHEN 'DATA4' THEN DATA4
          WHEN 'DATA5' THEN DATA5
          WHEN 'DATA6' THEN DATA6
          WHEN 'DATA7' THEN DATA7
        END AS DATA
      FROM yourtable
      CROSS JOIN (
        SELECT 'DATA1' AS col
        UNION ALL SELECT 'DATA2'
        UNION ALL SELECT 'DATA3'
        UNION ALL SELECT 'DATA4'
        UNION ALL SELECT 'DATA5'
        UNION ALL SELECT 'DATA6'
        UNION ALL SELECT 'DATA7'
      ) s
    ) s
    WHERE DATA > 0
    ;
    
    Run Code Online (Sandbox Code Playgroud)

    (在某种程度上,这类似于@ bluefeet的建议,它只是不使用任何UNION.)