2013-10-04 11 views
6

में ग्रुप द्वारा उपयोग करने के लिए T_TABLE2 की संरचनाकैसे Firebird

ID INT 
TBL1_ID INT 
TESTER VARCHAR 
LOT_ID VARCHAR 
GRP VARCHAR 
SITE_NUM INT 
TEST_NUM VARCHAR 
TEST_DESC VARCHAR 
MEASUREMENT DOUBLE PRECISION 
UNIT VARCHAR 
LL DOUBLE PRECISION 
UL DOUBLE PRECISION 
STATUS VARCHAR 

है और मैं Firebird परीक्षण अपनी क्वेरी में एसक्यूएल संपादक का उपयोग करें। टी क्वेरी

SELECT TEST_DESC, MEASUREMENT, LL, UL 
FROM T_TABLE2 
GROUP BY TEST_DESC 

लेकिन मुझे यह त्रुटि समूह में मिली।

Invalid token. 
Dynamic SQL Error. 
SQL error code = -104. 
Invalid expression in the select list (not contained in either an aggregate function or the GROUP BY clause). 

उत्तर

6

आप MySQL से आ रही किया जाना चाहिए:

तो तुम जैसे कुछ करने की ज़रूरत है। MySQL - IMHO भ्रामक रूप से, गलत तरीके से, और एक काले-जादुई, अप्रत्याशित तरीके से - आपको आंशिक GROUP BY क्वेरी निर्दिष्ट करने की अनुमति देता है और डेटाबेस इंजन शेष क्वेरी से पता लगाने की कोशिश करता है जो गैर-समूहित- आप चाहते हैं कॉलम द्वारा। दूसरी ओर, मानक एसक्यूएल (फायरबर्ड और अधिकांश अन्य आरडीबीएमएस) नहीं है; इसके लिए समूह में निहित किसी भी गैर-समेकित कॉलम की आवश्यकता होती है, और किसी गैर-समूह-कॉलम को स्पष्ट रूप से निर्दिष्ट करने के लिए जो पंक्ति आप निर्दिष्ट करना चाहते हैं।

आपके मामले में, अपमानजनक कॉलम MEASUREMENT, LL, और UL हैं। आपको निर्दिष्ट करना होगा जोMEASUREMENT, LL, और UL आप चाहते हैं (हाँ, भले ही वे सभी समान हों; डेटाबेस इंजन के पास यह जानने या इसकी गारंटी देने का कोई तरीका नहीं है), या यदि आप एक या अधिक से समूह करना चाहते हैं कॉलम या संभवतः आप कुल मिलाकर भूल गए थे (क्या आप SUM चाहते थे?)


वैध प्रश्नों के उदाहरण: सभी कॉलम (एक SELECT DISTINCT के बराबर) द्वारा

  1. समूह:

    SELECT TEST_DESC, MEASUREMENT, LL, UL 
    FROM T_TABLE2 
    GROUP BY TEST_DESC, MEASUREMENT, LL, UL 
    
  2. समूह MEASUREMENT रूप में अच्छी तरह से और MIN डालूँगा लौट सकते हैं और MAX उल:

    SELECT TEST_DESC, MEASUREMENT, MIN(LL), MAX(UL) 
    FROM T_TABLE2 
    GROUP BY TEST_DESC, MEASUREMENT 
    
  3. SUM गैर वर्गीकृत किया कॉलम:

    SELECT TEST_DESC, SUM(MEASUREMENT), SUM(LL), SUM(UL) 
    FROM T_TABLE2 
    GROUP BY TEST_DESC 
    
  4. समुच्चय का एक संयोजन:

    SELECT TEST_DESC, COUNT(DISTINCT MEASUREMENT), SUM(LL), MAX(UL) 
    FROM T_TABLE2 
    GROUP BY TEST_DESC 
    
+0

मैं सब पर अपने 'काला जादू' नहीं लगता कि, यह सिर्फ क्या ले जाता है यदि आप समूह समूह कार्य करते हैं, तो आप समूहबद्ध होते हैं, तो यह सामान्य रूप से चलता है, अन्यथा यह पहले या आखिरी या जो कुछ भी आपको स्पष्ट रूप से परवाह नहीं करता है। – Felype

2

आप SELECT खंड में स्तंभों को GROUP BY का हिस्सा नहीं हैं में से प्रत्येक के लिए कुछ समेकित फ़ंक्शन (COUNT(), MIN(), MAX(), SUM(), ...) आवेदन करना होगा।

उदाहरण के लिए आपकी क्वेरी लग सकता है

SELECT TEST_DESC, MAX(MEASUREMENT) MAX_MEASUREMENT, MAX(LL) MAX_LL, MAX(UL) MAX_UL 
    FROM T_TABLE2 
GROUP BY TEST_DESC 

एक और वाक्य रचना वैध उपयोग की तरह विशिष्ट मानों की एक सूची प्राप्त करने के लिए है

SELECT TEST_DESC, MEASUREMENT, LL, UL 
    FROM T_TABLE2 
GROUP BY TEST_DESC, MEASUREMENT, LL, UL 

जो

SELECT DISTINCT TEST_DESC, MEASUREMENT, LL, UL 
    FROM T_TABLE2 

के बराबर है आप तो इस प्रश्न के साथ आप वास्तव में क्या हासिल करने की कोशिश कर रहे हैं, इस बारे में आपके प्रश्न में अधिक विशिष्ट होगा उत्तर में आपको विशेष जरूरतों को संबोधित किया जा सकता था।

2

हालांकि ऐसे MySQL के रूप में कुछ डेटाबेस,, मानक SQL में अधिक उदार है, जब आप GROUP BY का उपयोग कर रहे हैं, SELECT सूची ही शामिल होना चाहिए स्तंभों के आधार पर और कुल कार्यों (जैसे SUM(), MAX()) वर्गीकृत किया जा रहा है। यदि आपको अन्य कॉलम निर्दिष्ट करने की अनुमति दी गई थी, तो यह अनुमानित नहीं है कि समूहीकृत कॉलम की पंक्तियों में से कौन से कॉलम आएंगे - आप विभिन्न पंक्तियों से कॉलम का मिश्रण भी प्राप्त कर सकते हैं।

SELECT TEST_DESC, MAX(MEASUREMENT) MEASUREMENT, MAX(LL) LL, MAX(UL) UL 
FROM T_TABLE2 
GROUP BY TEST_DESC 
संबंधित मुद्दे