【问题标题】:Column "invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause"列“在选择列表中无效,因为它不包含在聚合函数或 GROUP BY 子句中”
【发布时间】: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 

【问题讨论】:

标签: sql-server group-by


【解决方案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? ...?

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

      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 逻辑周期时出现错误
      猜你喜欢
      • 2011-07-04
      • 2011-05-22
      • 2014-11-02
      相关资源
      最近更新 更多