2013-02-26 109 views
5

यह सोचते हैं कि मैं एक डाटाबेस इस तरह एक क्षैतिज संरचना है कि है:डेटाबेस पर क्षैतिज मूल्यों को कैसे गिनना है?

ID | NAME | DATA1 | DATA2 | DATA3 | DATA4 | DATA5 | DATA6 | DATA7 
1 | mmm | 0 | 1 | 0 | 3 | 5 | 1 | 0 
2 | bbb | 0 | 0 | 0 | 1 | 0 | 1 | 1 

जानकारियां डेटा फ़ील्ड हैं और मैं हर समय गिनती करने के लिए है कि इस तरह के रूप में "एक निश्चित विभेदक, 0 से अधिक है चाहते हैं "

तरह से मैंने सोचा कि यह पाश बेलन सभी क्षेत्रों प्रत्येक DATA क्षेत्र SUM() उन 7 प्रश्नों है, और गिनती, या COUNT(), इसलिए ... किसी को भी एक और विचार है?

इस मामले परिणाम में

, तो "count every DATA field with a value over 0" होगा = 7

+2

आप इस गतिशील रूप से करने की जरूरत है या स्तंभों तय कर रहे हैं? –

+0

अच्छी तरह से, मान लें कि कॉलम ठीक हो गया है, इसलिए Coulmn DATA1 से DATA7 तक हैं, वास्तव में एक गतिशील समाधान अच्छा होना चाहिए। –

+1

पहले अपने डेटा को सामान्य करें – Strawberry

उत्तर

5

नहीं है कोई अंतर्निहित वाक्य रचना है कि आप स्पष्ट रूप से उन्हें नामकरण के बिना अर्थात गतिशील कॉलम का समूह का उल्लेख करने, की अनुमति होगी। यदि आप गतिशीलता चाहते हैं, तो आपको आवश्यक कॉलम नामों को पकड़ने के लिए मेटाडेटा से पूछताछ करने की आवश्यकता होगी, फिर गतिशील रूप से अंतिम क्वेरी बनाएं।

लेकिन इससे पहले आपको अभी भी यह पता होना चाहिए कि नौकरी करने के बारे में गतिशील क्वेरी को वास्तव में कैसे जाना चाहिए। तो, आपको सबसे पहले परिमित कॉलम सेट पर समस्या को हल करने की आवश्यकता होगी।

इस समस्या को हल करने के लिए एक से अधिक तरीके हैं। method suggested by @bluefeet शायद स्पष्ट और कम कुशल वाले लोगों में से एक है। अलग से सशर्त एकत्रीकरण का उपयोग कर

  1. गणना प्रत्येक स्तंभ और एक अभिव्यक्ति के सारे परिणाम जोड़: आपको कम से कम दो विकल्प की कोशिश कर सकते (। समझाया OR NULL चाल है here)

    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 
    ; 
    

  2. वर्चुअल टेबल में क्रॉस का उपयोग करते हुए 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 के सुझाव के समान है, यह सिर्फ किसी भी यूनियनों का इस्तेमाल नहीं करता।)

+0

बहुत सुरुचिपूर्ण और अच्छी तरह से समझाया गया, बहुत बहुत धन्यवाद, या नल चाल वास्तव में अच्छा है! –

3

चूंकि आपका डेटा आप unpivot डेटा परिणाम प्राप्त करने चाहिए सामान्यीकृत नहीं है। MySQL में एक unpivot फ़ंक्शन नहीं है ताकि आप अपने कॉलम पंक्तियों में कनवर्ट करने के लिए UNION ALL क्वेरी का उपयोग कर सकें। एक बार डेटा पंक्तियों में है, तो आप आसानी से मूल्यों की संख्या गिन सकते हैं। मैं यह करने के लिए कुछ इसी तरह का प्रयोग करेंगे:

select count(*) total 
from 
(
    select id, name, 'data1' col, data1 as value 
    from yourtable 
    union all 
    select id, name, 'data2' col, data2 as value 
    from yourtable 
    union all 
    select id, name, 'data3' col, data3 as value 
    from yourtable 
    union all 
    select id, name, 'data4' col, data4 as value 
    from yourtable 
    union all 
    select id, name, 'data5' col, data5 as value 
    from yourtable 
    union all 
    select id, name, 'data6' col, data6 as value 
    from yourtable 
    union all 
    select id, name, 'data7' col, data7 as value 
    from yourtable 
) src 
where value > 0 

देखें SQL Fiddle with Demo

+0

यूनियन सब - प्रदर्शन के बारे में क्या? – VAV

+0

@VAV 'यूनियन ऑल 'यूनियन' से बेहतर प्रदर्शन करता है क्योंकि यह किसी भी डुप्लिकेट रिकॉर्ड को नहीं हटाता है। – Taryn

+1

हां, और कोई भी "सॉर्टिंग" न करें, लेकिन 7-बार 'यूनियन' के बारे में मेरा प्रश्न और बड़े टेबल के लिए डेटा के परिणामी सेट के एकत्रीकरण - क्या यह उत्पादन समाधान है? – VAV