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
1440   3  

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? ...?

однако, следующие два запроса делают это ясно, и не вызовет ошибку:

  1. С помощью агрегат

    SELECT A, COUNT(B) AS T1, SUM(B) AS B
    FROM T2
    GROUP BY A
    

    вернутся:

    A  T1  B
    1  2   92
    2  3   68
    
  2. добавление столбца в 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

    Ничего не найдено.