Я хотел бы отобразить столбец B
в моем нижеприведенном SQL, но когда я добавляю его в запрос, он дает мне следующую ошибку:
Столбец T2.B 'недопустим в списке выбора, поскольку он не содержится ни в агрегатной функции, ни в предложении GROUP BY.
Мой код:
SELECT A, COUNT(B) as T1, B
FROM T2
WHERE ID=1
GROUP BY A
sql-server
group-by
мсвузе
источник
источник
Ответы:
Другими словами, эта ошибка сообщает вам, что SQL Server не знает, что
B
выбрать из группы.Либо вы хотите выбрать одно значение конкретное (например
MIN
,SUM
илиAVG
) , в этом случае вы должны использовать соответствующую статистическую функцию, или вы хотите , чтобы выбрать все значения в качестве новой строки (т.е. в том числеB
вGROUP BY
списке полей).Рассмотрим следующие данные:
Запрос
SELECT A, COUNT(B) AS T1 FROM T2 GROUP BY A
вернется:
что все хорошо.
Однако рассмотрим следующий (недопустимый) запрос, который приведет к этой ошибке:
SELECT A, COUNT(B) AS T1, B FROM T2 GROUP BY A
И возвращенный набор данных, иллюстрирующий проблему:
Однако следующие два запроса проясняют это и не вызывают ошибки:
Использование агрегата
SELECT A, COUNT(B) AS T1, SUM(B) AS B FROM T2 GROUP BY A
вернется:
Добавление столбца в
GROUP BY
списокSELECT A, COUNT(B) AS T1, B FROM T2 GROUP BY A, B
вернется:
источник
Следствием этого является то, что вам может потребоваться довольно безумный запрос, например,
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 существует исключительно для удовлетворения запросов синтаксического анализатора.
источник
Вы можете использовать case в обновлении и SWAP сколько угодно
update Table SET column=(case when is_row_1 then value_2 else value_1 end) where rule_to_match_swap_columns
источник