2013-08-15 12 views
45

Chciałbym wyświetlić kolumnę B w moim poniższym SQL, ale kiedy dodaję ją do zapytania, to daje mi następujący błąd:Kolumna "nieprawidłowa na liście wyboru, ponieważ nie jest zawarta ani w funkcji agregującej ani w klauzuli 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.

Mój kod:

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

możliwy duplikat [Klauzuli grupowej powodującej błąd] (http://stackoverflow.com/questions/16314836/group-by-clause-causing-error). Jeśli szukałeś tutaj w swoim komunikacie o błędzie, znajdziesz tu wiele dopasowań, które by Ci odpowiedziały. Proszę przynajmniej włożyć wysiłek w to, a także faktycznie * odczytać * komunikat o błędzie, który nie tylko opisuje dokładny problem, ale również dokładnie określa, która kolumna go powoduje. –

+0

Możliwy duplikat [Przyczyna kolumny jest nieprawidłowa na liście wyboru, ponieważ nie jest zawarta ani w funkcji agregującej, ani klauzuli GROUP BY] (http://stackoverflow.com/questions/13999817/reason-for-column-is -nieważne-na-liście-wyboru-ponieważ-to-nie-zawarte-w-e) – blo0p3r

Odpowiedz

91

Put innymi słowy, błąd ten jest informacją, że SQL Server nie wie któryB aby wybrać z grupy.

Albo chcesz wybrać jedną wartość konkretnego (np MIN, SUM lub AVG), w którym to przypadku należy użyć odpowiedniej funkcji zbiorczej, lub chcesz wybrać każdą wartość jako nowego wiersza (czyli w tym B w GROUP BY lista pól).


Rozważmy następujące dane:

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

zapytaniu

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

wróci:

 
A T1 
1 2 
2 3 

która jest wszystko dobrze.

jednak rozważyć następujący (nielegalny) kwerendę, która będzie produkować ten błąd:

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

A jej zwrócone Zestaw danych ilustrujących problem:

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

jednak następujące dwa zapytania sprawiają, że jest to jasne i nie spowoduje błędu:

  1. Korzystanie agregat

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

    wróci:

     
    A T1 B 
    1 2 92 
    2 3 68 
    
  2. Dodawanie kolumny do listy GROUP BY

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

    wróci:

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

dzięki za szczegółowe wyjaśnienie - naprawdę rozwiązałem niektóre z moich pytań. Najtrudniejszą częścią z początkowym problemem jest to, że możesz uruchomić kwerendę na optymalnym zestawie danych i nie otrzymasz tego wyjątku. ale gdy masz jakieś zduplikowane dane dla B, otrzymasz ten wyjątek. Lepiej zaplanuj zapytanie za pomocą przykładów, które lc. oddał z góry :) – qgicup

+0

co za miły kawałek odpowiedzi !! – Aaron

0

Konsekwencją jest to, że możesz potrzebować raczej szalenie wyglądającego zapytania, np. ,

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] 

Ponieważ tabela podstawowa jest tabelą podsumowania, jej klucz podstawowy obsługuje jedyną grupę lub zamówienie, które jest naprawdę konieczne. W związku z tym klauzula GROUP BY istnieje wyłącznie w celu spełnienia parser kwerend.

Powiązane problemy