Nie ma wbudowanej składni, która pozwalałaby na dynamiczne odwoływanie się do zestawu kolumn, tj. bez jawnego ich nazywania. Jeśli zależy Ci na dynamice, musisz użyć metadanych zapytań, aby pobrać wymagane nazwy kolumn, a następnie dynamicznie zbudować ostateczne zapytanie.
Ale zanim to nastąpi, nadal będziesz musiał mieć pomysł, jak dokładnie dynamiczne zapytanie powinno wykonać samo zadanie. Zatem najpierw musisz rozwiązać problem w skończonym zestaw kolumn.
Jest więcej niż jeden sposób na rozwiązanie tego problemu. metoda sugerowana przez @bluefeet jest prawdopodobnie jednym z jaśniejszych i mniej wydajnych. Możesz wypróbować co najmniej dwie alternatywy:
-
Policz każdą kolumnę osobno za pomocą agregacji warunkowej i zsumuj wszystkie wyniki w jednym wyrażeniu:
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 ;
(
OR NULL
sztuczka jest wyjaśniona tutaj .) -
Odwróć
DATA
kolumny za pomocą sprzężenia krzyżowego z wirtualną tabelą, a następnie zastosuj warunek do kolumny nieprzestawnej: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 ;
(W pewnym sensie jest to podobne do sugestii @bluefeet, po prostu nie wykorzystuje żadnych UNION).