Ich möchte die Spalte B
in meinem folgenden SQL anzeigen , aber wenn ich sie der Abfrage hinzufüge, wird folgende Fehlermeldung angezeigt :
Die Spalte T2.B 'ist in der Auswahlliste ungültig, da sie weder in einer Aggregatfunktion noch in der GROUP BY-Klausel enthalten ist.
Mein Code:
SELECT A, COUNT(B) as T1, B
FROM T2
WHERE ID=1
GROUP BY A
sql-server
group-by
msvuze
quelle
quelle
Antworten:
Mit anderen Worten, dieser Fehler weist darauf hin, dass SQL Server nicht weiß, welche
B
aus der Gruppe ausgewählt werden soll.Entweder Sie wollen einen bestimmten Wert wählen (zB
MIN
,SUM
oderAVG
) , in dem Fall , dass Sie die entsprechende Aggregatfunktion verwenden, oder Sie wollen jeden Wert als neue Zeile wählen (dh einschließlichB
in derGROUP BY
Feldliste).Betrachten Sie die folgenden Daten:
Die Abfrage
SELECT A, COUNT(B) AS T1 FROM T2 GROUP BY A
würde zurückkehren:
Das ist alles schön und gut.
Beachten Sie jedoch die folgende (unzulässige) Abfrage, die diesen Fehler verursachen würde:
SELECT A, COUNT(B) AS T1, B FROM T2 GROUP BY A
Und der zurückgegebene Datensatz veranschaulicht das Problem:
Die folgenden zwei Abfragen machen dies jedoch deutlich und verursachen den Fehler nicht:
Verwenden eines Aggregats
SELECT A, COUNT(B) AS T1, SUM(B) AS B FROM T2 GROUP BY A
würde zurückkehren:
Hinzufügen der Spalte zur
GROUP BY
ListeSELECT A, COUNT(B) AS T1, B FROM T2 GROUP BY A, B
würde zurückkehren:
quelle
Die Folge davon ist, dass Sie möglicherweise eine ziemlich verrückt aussehende Abfrage benötigen, z.
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 die Primärtabelle eine Übersichtstabelle ist, behandelt ihr Primärschlüssel die einzige Gruppierung oder Reihenfolge, die wirklich notwendig ist. Daher existiert die GROUP BY-Klausel nur, um den Abfrageparser zu erfüllen.
quelle
Sie können case in update und SWAP so viele verwenden, wie Sie möchten
update Table SET column=(case when is_row_1 then value_2 else value_1 end) where rule_to_match_swap_columns
quelle