【问题标题】:Column "invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause"列“在选择列表中无效,因为它未包含在聚合函数或 GROUP BY 子句中”
【发布时间】:2022-12-06 01:44:09
【问题描述】:

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

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

我的代码:

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

【问题讨论】:

标签: sql-server group-by


【解决方案1】:

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

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


考虑以下数据:

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

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

  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

【讨论】:

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

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

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

【讨论】:

    【解决方案3】:

    这样做的结果是您可能需要一个看起来很疯狂的查询,例如。 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 子句的存在仅仅是为了满足查询解析器的需求。

    【讨论】:

      【解决方案4】:

      我通过添加执行查询时错误中提到的 each group by 子句解决了这个问题。

      例如:让错误将消息显示为--

      Column 'table.dealer' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
      

      然后我在“group by”子句中添加了 table.dealer 列:

      Group by table.dealer
      

      它解决了我的问题。

      【讨论】:

        猜你喜欢
        • 2023-01-16
        • 1970-01-01
        • 2011-07-04
        • 2013-08-17
        相关资源
        最近更新 更多