Non esiste una sintassi incorporata che ti consenta di fare riferimento a un insieme di colonne in modo dinamico, ovvero senza denominarle esplicitamente. Se desideri la dinamicità, dovrai eseguire query sui metadati per acquisire i nomi di colonna richiesti, quindi creare la query finale in modo dinamico.
Ma prima avresti ancora bisogno di avere un'idea di come esattamente dovrebbe funzionare la query dinamica per eseguire il lavoro stesso. Quindi, dovrai prima risolvere il problema su un finito set di colonne.
C'è più di un modo per risolvere questo problema. Il metodo suggerito da @bluefeet è probabilmente uno dei più chiari e anche meno efficienti. Potresti provare almeno due alternative:
-
Conta ogni colonna separatamente usando l'aggregazione condizionale e somma tutti i risultati in un'unica espressione:
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 ;
(Il
OR NULL
il trucco è spiegato qui .) -
Annulla il pivot del
DATA
colonne utilizzando un cross join a una tabella virtuale, quindi applica la condizione alla colonna non pivot: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 ;
(In un certo senso, questo è simile al suggerimento di @bluefeet, semplicemente non impiega alcun UNION.)