sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo contar valores horizontales en una base de datos?

No hay una sintaxis integrada que le permita referirse a un conjunto de columnas dinámicamente, es decir, sin nombrarlas explícitamente. Si desea dinamismo, deberá consultar los metadatos para obtener los nombres de columna requeridos y luego crear la consulta final dinámicamente.

Pero antes de eso, aún necesita tener una idea de cómo debería realizar exactamente la consulta dinámica el trabajo en sí. Por lo tanto, primero deberá resolver el problema en un finito conjunto de columnas.

Hay más de una manera de resolver este problema. El método sugerido por @bluefeet es probablemente uno de los más claros y menos eficientes. Podría probar al menos dos alternativas:

  1. Cuente cada columna por separado usando agregación condicional y sume todos los resultados en una expresión:

    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
    ;
    

    (El OR NULL se explica el truco -a-condition" title="¿Por qué necesito "OR NULL" en MySQL al contar filas con una condición">aquí .)

  2. Quitar el pivote de los DATA columnas usando una unión cruzada a una tabla virtual, luego aplique la condición a la columna sin pivotar:

    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
    ;
    

    (En cierto modo, esto es similar a la sugerencia de @bluefeet, simplemente no emplea UNION).