2013-08-15 3 views
45

Ich möchte die Spalte B in meinem unten stehenden SQL anzeigen, aber wenn ich sie zur Abfrage hinzufüge, gibt sie es mir der folgende Fehler:Spalte "ungültig in der Auswahlliste, weil sie weder in einer Aggregatfunktion noch in der GROUP BY-Klausel enthalten ist"

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

Mein Code:

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

mögliches Duplikat von [Group By-Klausel verursacht Fehler] (http://stackoverflow.com/questions/16314836/group-by-clause-causing-error). Wenn Sie hier auf Ihrer Fehlermeldung gesucht haben, finden Sie hier viele Übereinstimmungen, die dies für Sie beantwortet hätten. Machen Sie sich zumindest die Mühe, die Fehlermeldung zu lesen, die nicht nur das genaue Problem beschreibt, sondern Ihnen auch genau sagt, welche Spalte sie verursacht. –

+0

Mögliches Duplikat von [Grund für Spalte ist in der Auswahlliste ungültig, da es weder in einer Aggregatfunktion noch in der GROUP BY-Klausel enthalten ist] (http://stackoverflow.com/questions/13999817/reason-for-column-is) -invalid-in-the-Select-Liste-weil-es-ist-nicht-enthalten-in-e) – blo0p3r

Antwort

91

Put mit anderen Worten, dieser Fehler Sie, dass SQL Server sagt nicht kennt dieB aus der Gruppe auszuwählen.

Entweder wollen Sie einen bestimmten Wert wählen (zB der MIN, SUM oder AVG), in dem Fall, dass Sie die entsprechende Aggregatfunktion verwenden würden, oder wollen Sie jeden Wert als neue Zeile wählen (dh einschließlich B in der GROUP BY Feldliste).


Betrachten Sie die folgende Daten:

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

Die Abfrage

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

zurückkehren würde:

 
A T1 
1 2 
2 3 

, die alles schön und gut ist.

betrachten jedoch die folgende (illegalen) Abfrage, die diesen Fehler erzeugen würde:

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

Und seine zurück Datensatz illustriert das Problem:

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

jedoch die folgenden zwei Abfragen machen dies klar und verursachen den Fehler nicht:

  1. Mit ein Aggregat

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

    zurückkehren würde:

     
    A T1 B 
    1 2 92 
    2 3 68 
    
  2. die Spalte auf der Liste GROUP BY

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

    zurückkehren würde hinzufügen:

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

danke für diese detaillierte Erklärung - wirklich einige meiner Fragen gelöst. Der knifflige Teil mit dem anfänglichen Problem ist, dass Sie die Abfrage für einen optimalen Datensatz ausführen können, und Sie erhalten diese Ausnahme nicht. Wenn Sie jedoch doppelte Daten für B erhalten haben, erhalten Sie diese Ausnahme. Also besser planen Sie Ihre Abfrage mit den Beispielen, dass LC. gab im Voraus :) – qgicup

+0

was für ein schönes Stück Antwort !! – Aaron

0

Die Konsequenz daraus ist, dass Sie eine ziemlich wahnsinnig aussehende Abfrage benötigen, 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] 

Da der Primärtabelle ist eine Übersichtstabelle, dessen Primärschlüssel die einzige Gruppierung oder Bestell Griffe, die wirklich notwendig ist. Daher existiert die GROUP BY-Klausel nur, um den Abfrageparser zu erfüllen.

Verwandte Themen