列“在选择列表中无效,因为它既不在聚合函数中也不在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子句的可能重复项导致错误。如果您在此处搜索错误消息,则会在此处找到许多匹配项,这些匹配项将为您解答。请至少为此付出努力,并实际阅读错误消息,该消息不仅描述了确切的问题,而且还告诉您确切的原因。
肯·怀特

Answers:


150

换句话说,此错误告诉您SQL Server不知道从组中选择哪个 B

要么你想选择一个特定的值(例如MINSUMAVG),在这种情况下,你会使用相应的聚合函数,或者你想选择的每个值作为新行(即包括BGROUP 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

会返回:

T1
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 2014年

多么好的答案!
艾琳(Aerin)'17年

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子句以满足查询解析器。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.