2013-08-15 12 views
45

Vorrei visualizzare la colonna B nel mio sotto SQL, ma quando la aggiungo alla query che mi fornisce il seguente errore:Colonna "non valida nell'elenco di selezione perché non è contenuta in una funzione di aggregazione o nella clausola GROUP BY"

Column T2.B' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

il mio codice:

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

possibile duplicato della [clausola Group By che causa errore] (http://stackoverflow.com/questions/16314836/group-by-clause-causing-error). Se hai cercato qui sul tuo messaggio di errore, troverai molte partite qui che avrebbero risposto per te. Si prega almeno di mettere lo sforzo per farlo, così come in realtà * leggendo * il messaggio di errore, che non solo descrive il problema esatto ma ti dice esattamente quale colonna lo sta causando. –

+0

Possibile duplicato di [Motivo per colonna non valido nell'elenco di selezione perché non è contenuto in una funzione di aggregazione o nella clausola GROUP BY] (http://stackoverflow.com/questions/13999817/reason-for-column-is -invalid-in-the-select-list-perché-it-is-non-contained-in-e) – blo0p3r

risposta

91

put in altre parole, questo errore vi sta dicendo che SQL Server non sa cheB per selezionare dal gruppo.

O si desidera selezionare un valore specifico (ad esempio la MIN, SUM o AVG), nel qual caso si usa la funzione di aggregazione appropriato, o si desidera selezionare ogni valore come nuova riga (ossia inclusi B nel Elenco dei campi GROUP BY).


Considerate i seguenti dati:

 
ID A B 
1 1 13 
1 1 79 
1 2 13 
1 2 13 
1 2 42 

La query

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

sarebbero tornati:

 
A T1 
1 2 
2 3 

che è cosa buona e giusta.

considerare tuttavia, la seguente query (illegale), che produrrebbe questo errore:

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

E suoi dati restituiti set illustra il problema:

 
A T1 B 
1 2 13? 79? Both 13 and 79 as separate rows? (13+79=92)? ...? 
2 3 13? 42? ...? 

Tuttavia, i seguenti due le query lo rendono chiaro e non causeranno l'errore:

  1. Utilizzando un aggregato

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

    restituirebbe:

     
    A T1 B 
    1 2 92 
    2 3 68 
    
  2. Aggiunta della colonna all'elenco GROUP BY

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

    restituirebbe:

     
    A T1 B 
    1 1 13 
    1 1 79 
    2 2 13 
    2 1 42 
    
+1

grazie per questa spiegazione dettagliata - ho davvero risolto alcune delle mie domande. la parte difficile del problema iniziale è che puoi eseguire la query su un set di dati ottimale e non otterrai questa eccezione. ma quando hai alcuni dati duplicati per B, riceverai quell'eccezione. Quindi meglio pianificare la tua query con gli esempi che lc. dato in anticipo :) – qgicup

+0

che bel pezzo di risposta !! – Aaron

0

La conseguenza di questo è che potrebbe essere necessario una query dall'aspetto piuttosto folle, e. g.,

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] 

Dal momento che la tabella principale è una tabella riassuntiva, la sua chiave primaria gestisce l'unico raggruppamento o ordinamento che è veramente necessario. Quindi, la clausola GROUP BY esiste esclusivamente per soddisfare il parser della query.

Problemi correlati