Подтвердить что ты не робот

Столбец "недействителен в списке выбора, потому что он не содержится ни в агрегатной функции, ни в предложении GROUP BY"

Я хотел бы отобразить столбец B в моем ниже SQL, но когда я добавлю его в запрос, он вызывает следующую ошибку:

Столбец T2.B ' в списке выбора недействителен, поскольку он не содержится ни в агрегатная функция или предложение GROUP BY.

Мой код:

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

Ответ 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 существует исключительно для удовлетворения анализатора запросов.