कॉलम "चयनित सूची में अमान्य है क्योंकि यह या तो एक समुच्चय फ़ंक्शन या ग्रुप बाय क्लॉज़ में निहित नहीं है"


84

मैं Bअपने एसक्यूएल के नीचे कॉलम प्रदर्शित करना चाहूंगा , लेकिन जब मैं इसे क्वेरी में जोड़ता हूं तो यह मुझे निम्न त्रुटि देता है:

कॉलम T2.B 'चयनित सूची में अमान्य है क्योंकि यह किसी समुच्चय फ़ंक्शन या ग्रुप बाय क्लॉज़ में निहित नहीं है।

मेरा कोड:

SELECT A, COUNT(B) as T1, B 
FROM T2 
WHERE ID=1 
GROUP BY A 

2
समूह का संभव डुप्लिकेट त्रुटि के कारण खंड द्वारा । यदि आपने अपने त्रुटि संदेश पर यहां खोज की है, तो आपको यहां बहुत सारे मैच मिलेंगे जिन्होंने आपके लिए इसका उत्तर दिया होगा। कृपया कम से कम उस प्रयास को करने में, साथ ही वास्तव में त्रुटि संदेश को पढ़ने में लगा दें, जो न केवल सटीक समस्या का वर्णन करता है, बल्कि आपको बताता है कि यह कौन सा कॉलम पैदा कर रहा है।
केन व्हाइट

जवाबों:


152

दूसरे शब्दों में कहें तो इस त्रुटि आप कह रहा है एसक्यूएल सर्वर नहीं जानता है कि जो B समूह से चयन करने के लिए।

या तो आप एक विशिष्ट मान का चयन (उदाहरण के लिए करना चाहते हैं MIN, SUMया AVG) इस स्थिति में आप का प्रयोग करेंगे उचित समेकित फ़ंक्शन, या आप हर (यानी सहित एक नई पंक्ति के रूप में मूल्य का चयन करना चाहते Bमें GROUP BYक्षेत्र सूची)।


निम्नलिखित आंकड़ों पर विचार करें:

आईडी एबी
१ १ १३
1 1 79
१ २ १३
१ २ १३
१ २ ४२

पूछताछ

SELECT A, COUNT(B) AS T1 
FROM T2 
GROUP BY A

लौटूंगा:

1 पर
१ २
२ ३

जो सब ठीक है और अच्छा है।

हालांकि निम्नलिखित (अवैध) क्वेरी पर विचार करें, जो इस त्रुटि का उत्पादन करेगा:

SELECT A, COUNT(B) AS T1, B 
FROM T2 
GROUP BY A

और इसका लौटा डेटा समस्या को स्पष्ट करता है:

A T1 B
१ २ १३? 79? दोनों 13 और 79 अलग पंक्तियों के रूप में? (13 + 79 = 92)? ...?
२ ३ १३? 42? ...?

हालाँकि, निम्न दो प्रश्न यह स्पष्ट करते हैं, और त्रुटि का कारण नहीं बनेंगे:

  1. एक समुच्चय का उपयोग करना

    SELECT A, COUNT(B) AS T1, SUM(B) AS B
    FROM T2
    GROUP BY A
    

    लौटूंगा:

    A T1 B
    1 2 92
    २ ३ ६ 2
    
  2. करने के लिए स्तंभ जोड़ना GROUP BYसूची

    SELECT A, COUNT(B) AS T1, B
    FROM T2
    GROUP BY A, B
    

    लौटूंगा:

    A T1 B
    १ १ १३
    1 1 79
    २ २ १३
    २ १ ४२
    

3
इस विस्तृत विवरण के लिए धन्यवाद - वास्तव में मेरे कुछ प्रश्नों को हल किया। प्रारंभिक समस्या के साथ मुश्किल हिस्सा, यह है कि आप कुछ इष्टतम डेटा सेट पर क्वेरी चला सकते हैं, और आपको वह अपवाद नहीं मिलेगा। लेकिन जब आपको B के लिए कुछ डुप्लिकेट डेटा मिला है, तो आपको वह अपवाद प्राप्त होगा। तो बेहतर है कि एलसी के उदाहरणों के साथ अपनी क्वेरी की योजना बनाएं। अपफ्रंट :)
qgicup

क्या अच्छा जवाब है !!
एरिन

0

इसका परिणाम यह है कि आपको एक पागल दिखने वाली क्वेरी की आवश्यकता हो सकती है, उदाहरण के लिए,

SELECT [dbo].[tblTimeSheetExportFiles].[lngRecordID]            AS lngRecordID
          ,[dbo].[tblTimeSheetExportFiles].[vcrSourceWorkbookName]  AS vcrSourceWorkbookName
          ,[dbo].[tblTimeSheetExportFiles].[vcrImportFileName]      AS vcrImportFileName
          ,[dbo].[tblTimeSheetExportFiles].[dtmLastWriteTime]       AS dtmLastWriteTime
          ,[dbo].[tblTimeSheetExportFiles].[lngNRecords]            AS lngNRecords
          ,[dbo].[tblTimeSheetExportFiles].[lngSizeOnDisk]          AS lngSizeOnDisk
          ,[dbo].[tblTimeSheetExportFiles].[lngLastIdentity]        AS lngLastIdentity
          ,[dbo].[tblTimeSheetExportFiles].[dtmImportCompletedTime] AS dtmImportCompletedTime
          ,MIN ( [tblTimeRecords].[dtmActivity_Date] )              AS dtmPeriodFirstWorkDate
          ,MAX ( [tblTimeRecords].[dtmActivity_Date] )              AS dtmPeriodLastWorkDate
          ,SUM ( [tblTimeRecords].[decMan_Hours_Actual] )           AS decHoursWorked
          ,SUM ( [tblTimeRecords].[decAdjusted_Hours] )             AS decHoursBilled
      FROM [dbo].[tblTimeSheetExportFiles]
      LEFT JOIN   [dbo].[tblTimeRecords]
              ON  [dbo].[tblTimeSheetExportFiles].[lngRecordID] = [dbo].[tblTimeRecords].[lngTimeSheetExportFile]
        GROUP BY  [dbo].[tblTimeSheetExportFiles].[lngRecordID]
                 ,[dbo].[tblTimeSheetExportFiles].[vcrSourceWorkbookName]
                 ,[dbo].[tblTimeSheetExportFiles].[vcrImportFileName]
                 ,[dbo].[tblTimeSheetExportFiles].[dtmLastWriteTime]
                 ,[dbo].[tblTimeSheetExportFiles].[lngNRecords]
                 ,[dbo].[tblTimeSheetExportFiles].[lngSizeOnDisk]
                 ,[dbo].[tblTimeSheetExportFiles].[lngLastIdentity]
                 ,[dbo].[tblTimeSheetExportFiles].[dtmImportCompletedTime]

चूंकि प्राथमिक तालिका एक सारांश तालिका है, इसलिए इसकी प्राथमिक कुंजी एकमात्र समूहन या ऑर्डरिंग को संभालती है जो वास्तव में आवश्यक है। इसलिए, समूह BY क्लॉज क्वेरी पार्सर को संतुष्ट करने के लिए पूरी तरह से मौजूद है।


0

आप अपडेट में केस का उपयोग कर सकते हैं और जितना चाहें उतना स्वैप कर सकते हैं

update Table SET column=(case when is_row_1 then value_2 else value_1 end) where rule_to_match_swap_columns
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.