列のセットを動的に、つまり明示的に名前を付けずに参照できるようにする組み込みの構文はありません。動的性が必要な場合は、メタデータをクエリして必要な列名を取得してから、最終的なクエリを動的に作成する必要があります。
ただし、その前に、動的クエリがジョブ自体を実行するためにどの程度正確に実行する必要があるかを理解する必要があります。したがって、最初に有限で問題を解決する必要があります。 列セット。
この問題を解決する方法は複数あります。 @bluefeetが提案する方法 おそらく、より明確で効率の悪いものの1つです。少なくとも2つの選択肢を試すことができます:
-
条件付き集計を使用してすべての列を個別にカウントし、すべての結果を1つの式に合計します。
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の提案に似ており、UNIONを使用していません。)