98

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

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

我的代码:

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

3 回答 3

175

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

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


考虑以下数据:

身份证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
    
于 2013-08-15T18:00:41.013 回答
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 子句的存在仅仅是为了满足查询解析器的要求。

于 2017-11-16T23:17:23.340 回答
0

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

update Table SET column=(case when is_row_1 then value_2 else value_1 end) where rule_to_match_swap_columns
于 2018-08-14T11:45:10.860 回答