2015-03-16 10 views
6

द्वारा ग्रुप फ़ील्ड/कॉलम द्वारा गैर-शून्य प्रविष्टियों को कैसे गिन सकता है? मैं पंक्ति से गिनने के कई उत्तरों देखता हूं लेकिन स्तंभों के लिए ऐसा करने के लिए हैक नहीं कर सकता।कॉलम द्वारा MySQL COUNT पूर्ण सामग्री, कॉलम

इनपुट:

╔════╦════════╦════════╦════════╗ 
║ id ║ field1 ║ field2 ║ field3 ║ 
║ 1 ║ do  ║ re  ║ me  ║ 
║ 2 ║ fa  ║  ║ so  ║ 
║ 3 ║ la  ║ te  ║  ║ 
║ 4 ║ da  ║ re  ║  ║ 
╚════╩════════╩════════╩════════╝ 

उत्पादन:

id  4 
field1 4 
field2 3 
field3 2 

मैं एक बहुत ही गंदा डेटाबेस मैं पलायन कर रहा हूँ में क्षेत्र के उपयोग पर एक गेज पाने के लिए कोशिश कर रहा हूँ। इस डेटाबेस में लगभग 50 कॉलम हैं इसलिए मैं ऐसे दृष्टिकोण की तलाश में हूं जिसमें प्रत्येक कॉलम नाम टाइपिंग शामिल न हो।

मैं भी गैर-शून्य & है कि खोज का विस्तार हो सकता है है-नहीं-खाली & ≠ 0 & ≠ "नहीं" क्योंकि डेटा भंडारण में विसंगतियों की - कुछ क्षेत्रों इस्तेमाल कभी नहीं किया गया था, लेकिन "नहीं" के साथ स्वत: भरा हुआ ।

इस उत्तर मैं क्या जरूरत के करीब लग रहा है लेकिन एक SQL त्रुटि उत्पन्न करता है और मैं टिप्पणी करने के लिए पर्याप्त प्रतिष्ठा नहीं है: Count number of NULL values in each column in SQL

+0

अपडेट किया गया है। – Slam

उत्तर

3

बस count() का उपयोग करें:

select count(field1), count(field2), count(field3) 
from table t; 

है यही कारण है कि count() करता है - - यह गैर-शून्य मानों की गणना करता है।

यदि आपके नामों को टाइप करने के लिए कोई विचलन है, तो स्तंभ नाम प्राप्त करने के लिए मेटाडेटा तालिकाओं (आमतौर पर information_schema.columns) का उपयोग करें। आप एक क्वेरी के रूप में SQL उत्पन्न कर सकते हैं, या कोड उत्पन्न करने के लिए कॉलम नामों को स्प्रेडशीट में कॉपी कर सकते हैं।

संपादित करें:

आप का उपयोग कर कोड उत्पन्न कर सकते हैं:

select group_concat('count(', column_name, ')' separate ', ') 
from information_schema.columns 
where table_name = <whatever> and table_schema = <whatever2>; 

नोट इसे एक से अधिक स्ट्रिंग तर्क लेने के लिए group_concat() की अल्पज्ञात क्षमता का उपयोग करता है। मैं MySQL का उपयोग कर रहा SQL नहीं है कि यदि एक फर्क नहीं पड़ता:

+0

आईएस आईटी .. मैंने अभी नई चीजें सीखी हैं .. – sumit

+0

लेकिन जब मैंने कोशिश की तो यह नल डेटा भी गिन रहा है – sumit

+0

@ गॉर्डन लिनॉफ, मुझे लगता है कि उपयोगकर्ता पंक्तिवार डेटा चाहता है, कॉलम के अनुसार नहीं। –

2
SELECT count(field1) as cnt ,'field1' as field from tbl where field1 IS NOT NULL 
UNION all 
SELECT count(field2) as cnt ,'field2' as field from tbl where field2 IS NOT NULL 
union all 
SELECT count(field3) as cnt ,'field3' as field from tbl where field3 IS NOT NULL 

अगर वहाँ केवल 3 निर्धारित क्षेत्र के ऊपर एसक्यूएल काम करेंगे

+2

यूनियन का उपयोग करें बल्कि –

+1

का उपयोग करें लगभग 50 फ़ील्ड। यह काम करेगा अगर मैं उन्हें सब टाइप करना चाहता था। – Slam

+0

आपको वास्तव में 'यूनियन ऑल' की आवश्यकता नहीं है जब तक कि कुछ कॉलम नाम समान न हों, जो संभव नहीं है। –

0

यहाँ sqlfiddle

SELECT 
    COUNT(id), 
    SUM(CASE WHEN field1 IS NOT NULL THEN 1 ELSE 0 END), 
    SUM(CASE WHEN field2 IS NOT NULL THEN 1 ELSE 0 END), 
    SUM(CASE WHEN field3 IS NOT NULL THEN 1 ELSE 0 END) 
FROM table1; 
संबंधित मुद्दे