SQL Server-столбец " недопустимый в списке выбора, поскольку он не содержится ни в агрегатной функции, ни в предложении GROUP BY"
Я хотел бы отобразить столбец B в моем ниже SQL, но когда я добавляю его в запрос он дает мне следующую ошибку:
Столбец T2.B'
недопустим в списке выбора, поскольку он не содержится в любом
агрегатная функция или предложение GROUP BY.
мой код:
SELECT A, COUNT(B) as T1, B
FROM T2
WHERE ID=1
GROUP BY A
3 ответов:
другими словами, эта ошибка говорит вам, что 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
следствием этого является то, что вам может понадобиться довольно безумный запрос, например,
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]
вы можете использовать case в обновлении и поменять столько, сколько вы хотите
update Table SET column=(case when is_row_1 then value_2 else value_1 end) where rule_to_match_swap_columns
Comments