Няма вграден синтаксис, който да ви позволи да се позовавате на набор от колони динамично, т.е. без изрично да ги наименувате. Ако искате динамичност, ще трябва да заявите метаданни, за да вземете необходимите имена на колони, след което да изградите динамично крайната заявка.
Но преди това все пак ще трябва да имате представа как точно трябва да действа динамичната заявка за изпълнение на самата работа. Така че първо ще трябва да решите проблема на ограничен набор колони.
Има повече от един начин за решаване на този проблем. Методът, предложен от @bluefeet вероятно е един от по-ясните, както и по-малко ефективни. Можете да опитате поне две алтернативи:
-
Пребройте всяка колона отделно, като използвате условно агрегиране и сумирайте всички резултати в един израз:
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
трикът е обяснен тук .) -
Развъртете
DATA
колони с помощта на кръстосано присъединяване към виртуална таблица, след което приложете условието към колоната без завъртане: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 ;
(В известен смисъл това е подобно на предложението на @bluefeet, просто не използва съюзи.)