我想B
在下面的 SQL 中显示该列,但是当我将它添加到查询中时,它给了我以下错误:
列 T2.B' 在选择列表中无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中。
我的代码:
SELECT A, COUNT(B) as T1, B
FROM T2
WHERE ID=1
GROUP BY A
我想B
在下面的 SQL 中显示该列,但是当我将它添加到查询中时,它给了我以下错误:
列 T2.B' 在选择列表中无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中。
我的代码:
SELECT A, COUNT(B) as T1, B
FROM T2
WHERE ID=1
GROUP BY A
换句话说,这个错误告诉你 SQL Server 不知道从组中选择哪个。 B
要么您想选择一个特定值(例如MIN
、SUM
或AVG
),在这种情况下您将使用适当的聚合函数,或者您想选择每个值作为新行(即包括B
在GROUP 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?...?
但是,以下两个查询清楚地说明了这一点,并且不会导致错误:
使用聚合
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
这样做的结果是您可能需要一个看起来相当疯狂的查询,例如,
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 子句的存在仅仅是为了满足查询解析器的要求。
您可以根据需要在更新和交换中使用案例
update Table SET column=(case when is_row_1 then value_2 else value_1 end) where rule_to_match_swap_columns