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:
-
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í .) -
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).