列“在选择列表中无效,因为它不包含在聚合函数或 GROUP BY 子句中”

Posted

技术标签:

【中文标题】列“在选择列表中无效,因为它不包含在聚合函数或 GROUP BY 子句中”【英文标题】:Column "invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause" 【发布时间】:2013-08-17 23:56:38 【问题描述】:

我想在下面的 SQL 中显示列 B,但是当我将它添加到查询中时,它给了我以下错误:

列 T2.B' 在选择列表中无效,因为它不包含在 聚合函数或 GROUP BY 子句。

我的代码:

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

【问题讨论】:

Group By clause causing error 的可能副本。如果您在此处搜索您的错误消息,您会在此处找到许多可以为您解答此问题的匹配项。请至少努力做到这一点,以及实际阅读错误消息,它不仅描述了确切的问题,而且准确地告诉你是哪一列导致了它。 Reason for Column is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause的可能重复 【参考方案1】:

您可以根据需要在更新和交换中使用案例

update Table SET column=(case when is_row_1 then value_2 else value_1 end) where rule_to_match_swap_columns

【讨论】:

【参考方案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 子句的存在只是为了满足查询解析器。

【讨论】:

【参考方案3】:

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

要么您想选择一个特定值(例如MINSUMAVG),在这种情况下您将使用适当的聚合函数,或者您想选择每个值作为新行(即在GROUP BY 字段列表中包括B


考虑以下数据:

编号 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

会返回:

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

但是,以下两个查询清楚地说明了这一点,并且不会导致错误:

    使用聚合

    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

【讨论】:

感谢您的详细解释 - 确实解决了我的一些问题。最初问题的棘手部分是您可以在一些最佳数据集上运行查询,并且您不会遇到该异常。但是当您为 B 获得一些重复数据时,您将收到该异常。因此,最好使用 lc 的示例来计划您的查询。预先给了:) 多么好的答案! 很好的答案 - 但是当我没有 group_by 逻辑周期时出现错误

以上是关于列“在选择列表中无效,因为它不包含在聚合函数或 GROUP BY 子句中”的主要内容,如果未能解决你的问题,请参考以下文章

SQL语句增加列修改列删除列

Oracle 列操作(增加列,修改列,删除列)

R语言dplyr包数据列重排(reorder)实战:把特定数据列移动到第一列把特定数据列移动到最后一列数据列多列重排按照字母顺序重排数据列把数据列反序

MySQL 添加列,修改列,删除列

pandas使用dataframe中的两列时间对象数据列作差生成时间差数据列指定时间数据列相加timedelta数据列实现数据偏移(向前偏移时间增加)

EXCEL如何根据A列相同内容在B列进行合并?