Il n'y a pas de syntaxe intégrée qui vous permettrait de faire référence à un ensemble de colonnes de manière dynamique, c'est-à-dire sans les nommer explicitement. Si vous voulez de la dynamique, vous devrez interroger les métadonnées pour saisir les noms de colonne requis, puis créer la requête finale de manière dynamique.
Mais avant cela, vous devez toujours avoir une idée de la manière dont la requête dynamique doit procéder pour effectuer le travail lui-même. Donc, vous devrez d'abord résoudre le problème sur un fini jeu de colonnes.
Il y a plus d'une façon de résoudre ce problème. La méthode suggérée par @bluefeet est probablement l'un des plus clairs et des moins efficaces. Vous pouvez essayer au moins deux alternatives :
-
Comptez chaque colonne séparément à l'aide de l'agrégation conditionnelle et additionnez tous les résultats dans une seule expression :
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 ;
(Le
OR NULL
l'astuce est expliquée ici .) -
Dépivoter les
DATA
colonnes à l'aide d'une jointure croisée à une table virtuelle, puis appliquez la condition à la colonne non pivotée :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 ;
(D'une certaine manière, cela ressemble à la suggestion de @bluefeet, cela n'emploie tout simplement aucun UNION.)