कोई अंतर्निहित वाक्यविन्यास नहीं है जो आपको गतिशील रूप से कॉलम के एक सेट को संदर्भित करने की अनुमति देगा, यानी उन्हें स्पष्ट रूप से नामित किए बिना। यदि आप गतिशीलता चाहते हैं, तो आपको आवश्यक कॉलम नामों को पकड़ने के लिए मेटाडेटा से पूछताछ करनी होगी, फिर अंतिम क्वेरी को गतिशील रूप से बनाना होगा।
लेकिन इससे पहले आपको अभी भी इस बात का अंदाजा होना चाहिए कि डायनामिक क्वेरी को काम करने के बारे में वास्तव में कैसे जाना चाहिए। इसलिए, आपको सबसे पहले समस्या को परिमित . पर हल करना होगा कॉलम सेट।
इस समस्या को हल करने के एक से अधिक तरीके हैं। @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
ट्रिक समझाया गया है -a-condition" title="किसी शर्त के साथ पंक्तियों की गणना करते समय मुझे MySQL में "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 के सुझाव के समान है, यह किसी यूनियन को नियोजित नहीं करता है।)