Sql server 列“”在选择列表中无效,因为它未包含在聚合函数或GROUP BY子句中
此表用于演示,但我有一个物理表,需要将其值插入另一个表中。此表中没有主键。我的问题是-使用SUM、AVG等聚合值获取一个SELECT语句中的所有数据的唯一方法是,非聚合字段列出GROUP BY子句中的所有非聚合字段,还是还有其他方法?在GROUPBY子句中列出大量字段会有什么影响? 以下是示例:Sql server 列“”在选择列表中无效,因为它未包含在聚合函数或GROUP BY子句中,sql-server,group-by,aggregate,Sql Server,Group By,Aggregate,此表用于演示,但我有一个物理表,需要将其值插入另一个表中。此表中没有主键。我的问题是-使用SUM、AVG等聚合值获取一个SELECT语句中的所有数据的唯一方法是,非聚合字段列出GROUP BY子句中的所有非聚合字段,还是还有其他方法?在GROUPBY子句中列出大量字段会有什么影响? 以下是示例: CREATE TABLE #SummaryData( [Col_Name] varchar(20) not NULL, [Col_Date] datetime NUL
CREATE TABLE #SummaryData(
[Col_Name] varchar(20) not NULL,
[Col_Date] datetime NULL,
[ColC] [decimal](18, 4) NULL,
[ColD] [decimal](18, 4) NULL,
[ColE] [decimal](18, 4) NULL
)
INSERT INTO #SummaryData ([Col_Name],[Col_Date],[ColC],[ColD],[ColE])
VALUES ('BOA' ,'03/10/2017', 2.4507 ,33536.0000 ,0.0073)
INSERT INTO #SummaryData ([Col_Name],[Col_Date],[ColC],[ColD],[ColE])
VALUES ('BOA' , '03/11/2017' , 9.9419,47041.0000, 0.0088)
INSERT INTO #SummaryData ([Col_Name],[Col_Date],[ColC],[ColD],[ColE])
VALUES ('Merrill Lynch', '03/10/2017', 2.8152, 32371.0000, 0.0042)
INSERT INTO #SummaryData ([Col_Name],[Col_Date],[ColC],[ColD],[ColE])
VALUES ('Merrill Lynch', '03/11/2017', 9.9333, 35671.0000, 0.0444)
--NOTE: Next SELECT will be used to INSERT data into another table, so I need all fields
SELECT [Col_Name],[Col_Date],[ColC],
CASE WHEN SUM([ColE]) > 0 THEN SUM([ColD])/SUM([ColE]) ELSE 0 END AS SomeVal , [ColE]
FROM #SummaryData
GROUP BY [Col_Name],[Col_Date],[ColE],[ColC]
如果我没有将ColE和ColC包括在GROUP BY子句中,我会得到:
Msg 8120, Level 16, State 1, Line 21
Column '#SummaryData.Col_Date' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
无论何时使用聚合函数,SELECT语句中的所有非聚合值都需要显示在GROUPBY语句中。如果要插入聚合值,则需要使用group by。那么,为什么需要使用SUM函数呢?只有在合并的条目重复时才需要这样做。下面的查询避免求和,因此不需要group by
SELECT [Col_Name],[Col_Date],[ColC],
CASE WHEN [ColE] > 0 THEN [ColD]/[ColE] ELSE 0 END AS SomeVal , [ColE]
FROM @SummaryData
如果要查看所有记录,则根本不能使用GROUP BY。如果需要整个表中的中间值,如SUMColE和SUMColD,则可以计算它们并将其转换为一个值。然后,您可以随意使用这些变量
DECLARE @SumE DECIMAL(18, 4);
SELECT @SumE = SUM(ColE) FROM #SummaryData
这完全正确,GROUPBY具有所有非聚合函数
但是为什么呢
简单演示:-
预期的结果是:-
因此,为了实现这一点,您必须选择count empid&departmentName,然后使用非聚合函数departmentName进行分组,因为这是通过下一个代码进行分组的方法:-
select count (empid) countEmpID, departmentName
from emp
group by departmentName
这样,如果您没有将非加积门函数放在group by中,则会出现下一个错误:-
Msg 8120,16级,状态1,第15行“emp.departmentName”列为
在选择列表中无效,因为它不包含在
聚合函数或GROUPBY子句
希望有帮助。没错。除非字段选择中的每个字段实例都在聚合函数中,否则该字段必须在GROUP BY子句中。因为您的SELECT同时返回ColC和ColE,所以您需要将它们包括在GROUP BY中。然而,很难说出您想要什么结果,因为您的示例似乎根本不需要聚合。我建议您发布预期结果。从select中删除cole和colc,或者将它们添加到group by。实际上,这只是一个示例,但我有一个很长的查询,其中我必须使用许多聚合和非聚合字段。1.通过使用SUM,值将被舍入。2.可以按所有剩余的非聚合字段分组吗?或者,我应该先插入非聚合字段,然后用聚合字段更新表吗?按非聚合字段分组就可以了。Group by的性能受到影响,但聚合需要Group by,并在聚合时防止重复记录。
countEmpID departmentName
5 Developemnet
3 HR
2 Sales
select count (empid) countEmpID, departmentName
from emp
group by departmentName