Столбец "недействителен в списке выбора, потому что он не содержится ни в агрегатной функции, ни в предложении GROUP BY"
Я хотел бы отобразить столбец B
в моем ниже SQL, но когда я добавлю его в запрос, он вызывает следующую ошибку:
Столбец T2.B ' в списке выбора недействителен, поскольку он не содержится ни в агрегатная функция или предложение GROUP BY.
Мой код:
SELECT A, COUNT(B) as T1, B
FROM T2
WHERE ID=1
GROUP BY A
Ответы
Ответ 1
Иными словами, эта ошибка говорит вам, что SQL Server не знает, какой B
выбрать из группы.
Или вы хотите выбрать одно конкретное значение (например, MIN
, SUM
или AVG
), и в этом случае вы должны использовать соответствующую функцию агрегата или хотите выбрать каждое значение в качестве новой строки ( т.е. включая B
в списке полей GROUP BY
).
Рассмотрим следующие данные:
ID A B
1 1 13
1 1 79
1 2 13
1 2 13
1 2 42
Запрос
SELECT A, COUNT(B) AS T1
FROM T2
GROUP BY A
вернется:
A T1
1 2
2 3
который все хорошо и хорошо.
Однако рассмотрим следующий (незаконный) запрос, который вызвал бы эту ошибку:
SELECT A, COUNT(B) AS T1, B
FROM T2
GROUP BY A
И его возвращаемый набор данных, иллюстрирующий проблему:
A T1 B
1 2 13? 79? Both 13 and 79 as separate rows? (13+79=92)? ...?
2 3 13? 42? ...?
Однако следующие два запроса делают это ясным и не будут вызывать ошибки:
-
Использование агрегата
SELECT A, COUNT(B) AS T1, SUM(B) AS B
FROM T2
GROUP BY A
вернется:
A T1 B
1 2 92
2 3 68
-
Добавление столбца в список GROUP BY
SELECT A, COUNT(B) AS T1, B
FROM T2
GROUP BY A, B
вернется:
A T1 B
1 1 13
1 1 79
2 2 13
2 1 42
Ответ 2
Следствием этого является то, что вам может потребоваться довольно сумасшедший запрос, например. 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]
Поскольку первичная таблица является сводной таблицей, ее первичный ключ обрабатывает единственную группировку или упорядочение, которые действительно необходимы. Следовательно, предложение GROUP BY существует исключительно для удовлетворения анализатора запросов.