Não há sintaxe interna que permita que você faça referência a um conjunto de colunas dinamicamente, ou seja, sem nomeá-las explicitamente. Se você quiser dinamicidade, precisará consultar metadados para obter os nomes de coluna necessários e, em seguida, criar a consulta final dinamicamente.
Mas antes disso você ainda precisa ter uma ideia de como exatamente a consulta dinâmica deve executar o trabalho em si. Então, primeiro você precisa resolver o problema em um finito conjunto de colunas.
Há mais de uma maneira de resolver esse problema. O método sugerido por @bluefeet é provavelmente um dos mais claros e menos eficientes. Você pode tentar pelo menos duas alternativas:
-
Conte cada coluna separadamente usando agregação condicional e some todos os resultados em uma expressão:
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 ;
(OOR NULL
o truque é explicado aqui .)
-
Desarticular osDATA
colunas usando uma junção cruzada para uma tabela virtual e, em seguida, aplique a condição à coluna não dinâmica:
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 ;
(De certa forma, isso é semelhante à sugestão do @bluefeet, apenas não emprega nenhum UNION.)