Es gibt keine integrierte Syntax, mit der Sie dynamisch auf eine Reihe von Spalten verweisen könnten, d. H. Ohne sie explizit zu benennen. Wenn Sie Dynamik wünschen, müssen Sie Metadaten abfragen, um die erforderlichen Spaltennamen zu erhalten, und dann die endgültige Abfrage dynamisch erstellen.
Aber vorher müssten Sie noch eine Vorstellung davon haben, wie genau die dynamische Abfrage den Job selbst ausführen soll. Sie müssen also zuerst das Problem endlich lösen Spaltensatz.
Es gibt mehr als eine Möglichkeit, dieses Problem zu lösen. Die Methode, die von @bluefeet vorgeschlagen wird ist wahrscheinlich einer der klareren sowie weniger effizienten. Sie könnten mindestens zwei Alternativen ausprobieren:
-
Zählen Sie jede Spalte separat mit bedingter Aggregation und addieren Sie alle Ergebnisse in einem Ausdruck:
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 ;
(Der
OR NULL
Trick wird erklärt hier .) -
Entpivotieren Sie die
DATA
Spalten, die einen Cross Join mit einer virtuellen Tabelle verwenden, und wenden Sie dann die Bedingung auf die nichtpivotierte Spalte an: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 gewisser Weise ähnelt dies dem Vorschlag von @bluefeet, es verwendet nur keine UNIONs.)