Tidak ada sintaks bawaan yang memungkinkan Anda untuk merujuk ke sekumpulan kolom secara dinamis, yaitu tanpa menyebutkan namanya secara eksplisit. Jika Anda menginginkan dinamika, Anda perlu membuat kueri metadata untuk mengambil nama kolom yang diperlukan, lalu membuat kueri akhir secara dinamis.
Tetapi sebelum itu Anda masih perlu memiliki gagasan bagaimana tepatnya kueri dinamis harus melakukan pekerjaan itu sendiri. Jadi, pertama-tama Anda harus menyelesaikan masalah dengan terbatas kumpulan kolom.
Ada lebih dari satu cara untuk menyelesaikan masalah ini. metode yang disarankan oleh @bluefeet mungkin salah satu yang lebih jelas dan juga kurang efisien. Anda dapat mencoba setidaknya dua alternatif:
-
Hitung setiap kolom secara terpisah menggunakan agregasi bersyarat dan jumlahkan semua hasil dalam satu ekspresi:
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
trik dijelaskan di sini .) -
Lepas
DATA
kolom menggunakan gabungan silang ke tabel virtual, lalu terapkan kondisi ke kolom yang tidak dipilih: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 ;
(Di satu sisi, ini mirip dengan saran @bluefeet, hanya saja tidak menggunakan UNION apa pun.)