Стовпець "недійсний у списку вибору, оскільки він не міститься ні в сукупній функції, ні в реченні GROUP BY"


83

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

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

Мій код:

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

2
можливий дублікат речення Group By, що спричиняє помилку . Якби ви шукали тут у своєму повідомленні про помилку, ви знайшли б тут багато збігів, які відповіли б на вас. Будь ласка, принаймні докладіть зусиль для цього, а також для фактичного прочитання повідомлення про помилку, яке не лише описує точну проблему, але і точно вказує, який стовпець її спричиняє.
Ken White

Відповіді:


151

Іншими словами, ця помилка говорить вам про те, що SQL Server не знає, що B вибрати з групи.

Або ви хочете вибрати одне значення конкретне (наприклад MIN, SUMчи AVG) , в цьому випадку ви повинні використовувати відповідну статистичну функцію, або ви хочете , щоб вибрати всі значення в якості нового рядка (тобто в тому числі Bв GROUP BYсписку полів).


Розглянемо такі дані:

ID AB
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

повернеться:

Т1
1 2
2 3

що все добре і добре.

Однак розгляньте такий (незаконний) запит, який може спричинити цю помилку:

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

І його повернутий набір даних, що ілюструє проблему:

A T1 B
1 2 13? 79? І 13, і 79 як окремі ряди? (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
    

3
дякую за це детальне пояснення - справді вирішив деякі мої запитання. хитра частина з початковою проблемою полягає в тому, що ви можете запустити запит на якомусь оптимальному наборі даних, і ви не отримаєте такого винятку. але коли у вас є кілька дублікатів даних для B, ви отримаєте цей виняток. Тож краще сплануйте свій запит на прикладах, які lc. дав вперед :)
qgicup

яка гарна відповідь !!
Ерін

0

Наслідком цього є те, що вам може знадобитися досить шалений на вигляд запит, наприклад,

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


0

Ви можете використовувати регістр для оновлення та SWAP скільки завгодно

update Table SET column=(case when is_row_1 then value_2 else value_1 end) where rule_to_match_swap_columns
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.